Wpis z mikrobloga

Mircy z #cpp mam problemo z dynamicznymi tablicami. A w zasadzie to ciągle mi się miesza.
Taki zapis rozumia:

int *tablica;

tablica = new int [3];

I tutaj np. wstawiam:

for(i =0; i<3; i++) {

*tablica = i;

tablica++;

}

Takiego zapisu nie rozumia:

int *tablica;

tablica = new int [3];

I tutaj np. wstawiam:

for(i =0; i<3; i++) {

tablica[i] = i;

}


Czemu używam zapisu "tablica[i]"? Przecież samo "tablica" powinno zwracać tylko adres zerowego miejsca...
#naukaprogramowania
  • 23
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Taka pętla for raczej nie powinna działać :P
Co do wskazywania elementu tablicy to tab[i]==tab+i, można by rzec, że odwołanie przez indeks to odwołanie przez wskaźnik tylko inaczej zapisane
  • Odpowiedz
Taka pętla for raczej nie powinna działać :P


@Masuq0: To taki schemat na szybko żebyście załapali czego nie rozumiem, ale widzę że jak zwykle w pierwszej kolejności typowy mirek szuka co mógłby u kogoś poprawić, a nie jak pomóc. xD
  • Odpowiedz
@Dassault: pisze w javie, ale kiedyś coś tam c++ lizałem, więc może trafię:
sam wskaźnik tablicy, odpowiada jakiemuś miejscu w pamięciu np 0x0000 (co by nie była za duża liczba), dodatkowo kompilator wie że to jest np tablica intów, a każdy int ma 4 bajty, czyli kolejne elementy z tablicy mają adresy: [0x0000, 0x0004, 0x0008], więc robiąc wskaźnik tablica + 1 tak na prawdę dostajesz adres do inta na 0x0004,
  • Odpowiedz
@Dassault: indeksowanie to taki cukier składniowy dla programisty. kompilator koniec końców i tak tłumaczy to sobie na arytmetykę wskaźników.
Nie wiem czy mogę jaśniej bo sam nie wiem do końca czego nie rozumiesz.
  • Odpowiedz
@Dassault: ale czego dokładnie?

tablica[i] jest równoznaczna z *(tablica+i)

tablica to jakieś tam miejsce w pamięci, adres pierwszego elementu, kompilator zna tym elementu, więc zna też jego rozmiar, więc składnia tablica[i] robi to samo co *(tablica+i)
tablica + i - dodaje i * size(typ) do adresu tablicy, np adres tablicy to 0x0000, typ to int, a i to 2, więc:
0x0000 + 2 * size(int) = 0x0000 + 2 *
  • Odpowiedz
@GotoFinal: Nie musiałeś mi tego tak rozklepywać bo ja to rozumiem, pisałem ci przecież( ͡° ͜ʖ ͡°).
Na początku nie kumałem tego że tablica[i] to jest ten sam zapis co *(tablica = i). W zasadzie to dalej jest dla mnie dziwne. Dzięki za pomoc.

@inplaz: Dzięki, ja tego nie ogarniam bardziej ze strony składni niż sposobu działania. Jeszcze mnie trochę gnębi czemu to jest
  • Odpowiedz
@Dassault: "Jeszcze mnie trochę gnębi czemu to jest niby "to samo" a jednak wskaźniki są szybsze."
Nie sa.
Tak zeby Tobie jeszcze bardziej p-----c - mozesz tez napisac i[tablica] zamiast tablica[i] :)
  • Odpowiedz