Różnica między char* a char[]

Różnica między char* a char[]
FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Tak jak w temacie jaka jest różnica między:

Kopiuj
 char* 

a char tekst[]

Kopiuj
 ?
twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1

Pierwszy to wskaźnik, a drugi tablica znaków.

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Tylko że w obu można zapisać tekst, więc jaka jest różnica między tymi zapisami.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

Zasadnicza. Jak przypiszesz c-stringa do tablicy znaków to kompilator utworzy na stosie tablicę o odpowiednim rozmiarze i wpisze do niej tego stringa. Ale jak przypiszesz c-stringa do wskaźnika to ten wskaźnik będzie tylko pokazywał na obszar pamieci gdzie kompilator umieścił ten napis. W szczególności nie musi to być obszar stosu, ani w ogóle obszar pamięci którą mógłyś modyfikować.

edit: materiał poglądowy:
Tablica:
http://ideone.com/rEb3pO
Wskaźnik:
http://ideone.com/IgGPaF

Jak widać pierwsza opcja działa bo modyfikujemy dane w tablicy na stosie. Druga wersja się wysypuje bo próbujemy modyfikować napis w pamięci "stałej".

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1
fajnygosc napisał(a):

Tylko że w obu można zapisać tekst
Nie można.

Kopiuj
char tekst[10];
tekst[0] = 'a';
tekst[9] = 'z';

to jest poprawne

Kopiuj
char* wsk;
wsk[0] = 'a';

to NIE jest poprawne.

Kopiuj
char tekst[10];
char* wsk = tekst;
wsk[0] = 'a';

to jest poprawne, bo wsk wskazuje na istniejącą tablicę

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Jeżeli to o co pytasz jest podano jako argument funkcji np:

Kopiuj
void foo(char *text) {  }
void foo(char text[]) {  }

to nie ma praktycznie żadnej różnicy.
Z tym że w pierwszym przypadku możesz w środku procedury napisać: text=malloc(100); i od teko momentu ten text będzie wskazywać na co innego.
Przykład wydumany, sensownego raczej nie istnieje. Podano go tylko po to aby nie pisać że nie ma żadnej różnicy - bo to odbiegałoby od prawdy.

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0
Shalom napisał(a):

Zasadnicza. Jak przypiszesz c-stringa do tablicy znaków to kompilator utworzy na stosie tablicę o odpowiednim rozmiarze i wpisze do niej tego stringa. Ale jak przypiszesz c-stringa do wskaźnika to ten wskaźnik będzie tylko pokazywał na obszar pamieci gdzie kompilator umieścił ten napis. W szczególności nie musi to być obszar stosu, ani w ogóle obszar pamięci którą mógłyś modyfikować.

edit: materiał poglądowy:
Tablica:
http://ideone.com/rEb3pO
Wskaźnik:
http://ideone.com/IgGPaF

Jak widać pierwsza opcja działa bo modyfikujemy dane w tablicy na stosie. Druga wersja się wysypuje bo próbujemy modyfikować napis w pamięci "stałej".

Czyli w drugiej opcji jest wyciek pamięci?

gswidwa
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 839
1
Kopiuj
 
#include <iostream>
#include <conio.h>
#include <cstring>
using namespace std;

char *funkcja1(){
    char tekst[] = "Tekst w zmiennej lokalnej (tracisz go w momencie wyjścia z pętli / funkcji)";
    return tekst;
}
char *funkcja2(){
    char *tekst = new char[10];
    strcpy(tekst, "jakis tam tekst");
    return tekst;
}

int main()
{
    char *tekst1 = funkcja1();
    char *tekst2 = funkcja2();
    cout << "tekst1: " << tekst1 << endl;
    cout << "tekst2: " << tekst2 << endl;
    delete tekst2;
    getch();
}

Poczytaj o zmiennych lokalnych. za pomocą char[] tworzysz zmienną lokalną, zaś tworząc wskaźnik i alokując w nim pamięć dopóki dysponujesz tym wskaźnikiem możesz zawsze odwołać sie do zmiennej. Jak widzisz, funkcja 1 wyświetliła Ci jakies krzaczki. To dlatego, ponieważ przy wyjściu z funkcji tekst został bezczelnie usunięty :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.