Wpis z mikrobloga

#programowanie #cpp

Czym się różni:

char * tablica;


od:

char tablica[10];


?

Druga opcja od razu zeruje 10 kolejnych bajtów czy co? Bo jak dla mnie to i to i to to zwykły wskaźnik. :< A może w tym drugim przypadku ten wskaźnik jest stały i nie można po nim iterować?

Co do pierwszej opcji mogę przecież iterować i pisać po pamięci w przód i i tak nic nie nadpiszę więc nie widzę sensu istnienia opcji drugiej. :P No chyba że się mylę.
  • 15
  • Odpowiedz
@bartoneczek: to drugie to tablica, która ma implicit konwersję na wskaźnik do pierwszego elementu.

Róƶnica: wartość wskaźnika moƶesz zmienić. Tablicy nie. (moƶesz zmienić wartości elementów tablicy)
  • Odpowiedz
@bartoneczek: nie masz gwarancji wyzerowania, bardzo prawdopodobne, że będą tam jakieś śmieci, chyba, że deklarujesz zmienną globalną (gwarancji dalej nie ma, ale g++ chyba zeruje). Wydaje mi się, że tak jak za pomocą new, ale głowy sobie uciąć nie dam.
  • Odpowiedz
@bartoneczek: Tablica to nie jest wskaźnik. Za to wskaźnik dla ułatwienia ma syntax tablicy ;)

@2f1i: Close, but no cigar. Zaleƶy jak inicjalizujesz.

zmienna globalna/

static
: zawsze wyzerowana.

w funkcji/klasie nie

static
:

int t[5]; // wartości nieznane
int t[5] = {}; // wyzerowana, ≡ {0,0,0,0,0}
int t[5] = {1,2,3}; // ≡ {1,2,3,0,0}
  • Odpowiedz
  • 0
@KrzaQ2: mogę, ale poprzez np *(it+3) - samego wskaźnika it zmieniać nie mogę. Ale czym w takim razie jest ta alokacja i gdzie? System przy takiej alokacji jakoś blokuje ten obszar pamięci przed 'nieautoryzowanym' nadpisaniem, czy co? :P
  • Odpowiedz
@bartoneczek: Ale moƶesz przypisać adres początku do wskaźnika i jego uƶyć do przejścia ;)

tablica 10 zmiennych nie róƶni się od 10 zmiennych tego typu obok siebie, czy to na stosie, czy na stercie.

Inaczej mówiąc

int tab[3];


int elem1;
int elem2;
int elem3;
  • Odpowiedz
@kasper93: jeśli chodzi Ci o alokację to nie widzę różnicy między C i C++. Po prostu jeśli wpiszemy:

char tablica[10];


to ustaliliśmy już że alokujemy na stosie, natomiast gdybyśmy użyli operatora new, na stercie. Problem w tym że zastanawia mnie co tak naprawdę dzieje się podczas alokacji na stosie. Czy te 10 kolejny bajtów jest w jakiś sposób zarezerwowanych, czy czym ta alokacja tak po prawdzie jest?
  • Odpowiedz
@bartoneczek: alolacja rezerwuje ci pamięć, gdzie by nie byla. Jak masz char tab[10]; int a; to a zostanie zaalokowane za tablica charow (i to z uwzględnieniem wyrównania dla typow o rozmiarze powyżej jednego bajtu) co a zasadzie zaalokuje 10 bajtów dla char, dwa bajty wyrównania i 4 bajty na int. Później kod jest tak konstruowany, ze używając odpowiednich zmiennych dostajesz dostęp do konkretnych adresów. char* ptr;,to wskaźnik, ale to zmienna statyczna.
  • Odpowiedz