Generalnie tylko raz zobaczysz wskaźnik do tablicy (T (*a)[N]
) jest jako parametr funkcji, gdzie a
rozumie się tablica 2d:
void foo(int (*a)[N], size_t count)
{
size_t i;
for (i = 0; i < count; i++)
a[i][j] = ...;
...
}
void bar(void)
{
int arr[M][N];
foo(arr, M);
}
Zauważ, że dla deklaracja parametru funkcja, int a[][N]
jest równoważna int (*a)[N]
, ale to tylko prawdziwe dla deklaracji parametrów funkcja:
void foo (int a[][N], size_t count) {...}
Wskaźniki do tablic generalnie nie są tak użyteczne, jak wskaźniki do typu bazowego, ponieważ musisz znać rozmiar tablicy, aby poprawnie zadeklarować do niej wskaźnik (wskaźnik do 10-elementowej tablicy int jest innego typu od wskaźnik do 20-elementowej tablicy int). Osobiście nie znalazłem dla nich większego pożytku w 20-letnich programach.
Należy pamiętać, że w większości kontekstów, wyrażenie tablicowe (takie jak arr
powyżej) będzie miało swój typ niejawnie przekonwertowane z "N-elementowej tablicy T" na "wskaźnik do T" (z wyjątkiem sytuacji, gdy wyrażenie tablicy jest operandem sizeof
lub &
, lub tablica jest literałem łańcuchowym używanym jako inicjator w deklaracji). W tym przypadku typ arr
w wywołaniu foo jest niejawnie konwertowany z "M-elementowej tablicy N-elementowej tablicy int" na "wskaźnik do N-elementowej tablicy int".
Biorąc pod uwagę oświadczenie T a[M][N]
, wszystkie z poniższych wyrażeń oceni w tej samej lokalizacji (adres pierwszego elementu tablicy), ale typy będą różne, jak pokazano poniżej:
Expression Type Implicitly converted to
---------- ---- -----------------------
a T [M][N] T (*)[N]
a[0] T [N] T *
&a T (*)[M][N]
&a[0] T (*)[N]
&a[0][0] T *
wskaźnik do wskaźnika do typu int jest jednak użyteczne. – Toad
Nie sądzę, żebym kiedykolwiek potrzebował kodu przy użyciu wskaźnika do tablicy w ciągu 25 lat, które programowałem w C (użyłem tylko potrójnych wskaźników - SomeType *** var - kilka razy i zmienił kod, aby ich uniknąć tak szybko, jak tylko mogłem.) –
@reinier: na pewno, ale nie zapytałem o to – zaharpopov