W C tablica dowolnej komplikacji jest rozróżniana nazwą. np
ale nazwa Tablica jest tożsama ze wskażnikiem do początkowego elementu tablicy,
i można zapisać
i jest to całkowicie uprawnione. Co to jest tablica: jest to po prostu obszar pamięci, ciągły, którego kolejne elementy o rozmiarze sizeof(typ_elementu) są elementami tejże tablicy. już z tego prostego faktu wynika że dowolna tablica jest w pewnym sensie "jednowymiarowa".
Kod: Zaznacz cały
n = sizeof(Tablica[0]);
m = sizeof(Tablica[0][0]);
Aby dostać się do elementu okreslonego indeksami a,b,c
Kod: Zaznacz cały
val1 = Tablica[a][b][c];
val2 = *(pPtr + n*a + m*b + c);
val1 i val2 będą miały tę samą wartość. Zapis wskażnikowy jest tak naprawdę tym co robi za nas kompilator generując dostęp do elementu opisanego z pomocą zapisu tablicowego. dla obrabiania tablic wielowymiarowych jest to wygodne w zapisie tekstowym ale generuje duży i powolny kod. np przy przeskanowaniu tablicy po jednym indeksie
Kod: Zaznacz cały
for( i=0; i<30; i++ )
{......
val = Tablica[a][b][i];
......
}
wartość odpowiedniego wskazania do rzeczywistej pamięci jest wyliczana od podstaw za każdym obrotem pętli, ale można (zachowując niezbędną ostrożność)
Kod: Zaznacz cały
pPtr = &Tablica[a][b][0];// pierwszy element
for( i=0; i<30; i++ )
{......
val = *pPtr;
.......
pPtr++;// następny element
}
takie podejście pozwala skracać czas wykonania pętli (z reguły daje też mniejszy kod). dla pętli po innych wymiarach tablicy trzeba będzie modyfikować wskażnik o odpowiedni rozmiar
Kod: Zaznacz cały
pPtr += sizeof( Tablica[0][0] );// dla pętli po drugim indeksie
pPtr += sizeof( Tablica[0] ) ;// dla pętli po pierwszym indeksie
a teraz inaczej:
Kod: Zaznacz cały
pPtr = Tablica;
val 1 = Tablica[a][b][c];
val 2 = pPtr[ a*n+ b*m + c ];
jak widać do tablicy można się dostać zarówno jako do wielowymiarowej jak i jednowymiarowej tylko trzeba wiedzieć jak się poruszać po indeksach.
Może to ułatwi zrozumienie sprawy tablic i wskaźników.