Im Allgemeinen ist die einzige Zeit, die Sie einen Zeiger auf ein Array sehen werden (T (*a)[N]
) ist als Funktionsparameter, wo a
gemeint ist ein 2D-Array sein:
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);
}
Beachten Sie, dass für ein Funktionsparameter Erklärung ist int a[][N]
zu int (*a)[N]
äquivalent, aber dies ist nur für Funktionsparameter Deklarationen true:
void foo (int a[][N], size_t count) {...}
Zeiger auf Arrays sind im Allgemeinen nicht so nützlich wie Zeiger auf den Basistyp, da Sie die Array-Größe kennen müssen, um einen Zeiger darauf korrekt deklarieren zu können (ein Zeiger auf ein 10-Elemente-Array von int ist ein anderer Typ als a Zeiger auf ein 20-Elemente-Array von int). Persönlich habe ich nicht viel Gebrauch für sie in 20-einigen-ungeraden Jahren der Programmierung gefunden. Beachten Sie, dass in den meisten Kontexten ein Array-Ausdruck (z. B. arr
oben) seinen Typ implizit von "N-Element-Array von T" in "Zeiger auf T" konvertiert (außer wenn der Array-Ausdruck ein Operand von ist) sizeof
oder &
, oder das Array ist ein String-Literal, das als Initialisierer in einer Deklaration verwendet wird). In diesem Fall wird der Typ von arr
im Aufruf von foo implizit von "M-Element-Array von N-Element-Array von Int" in "Zeiger auf N-Element-Array von Int" konvertiert.
die Erklärung T a[M][N]
Gegeben, alle folgenden Ausdrücke werden, an den gleichen Ort (in dem Array die Adresse des ersten Elements) bewerten, aber die Typen unterschiedlich sein werden, wie unten gezeigt:
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 *
ein Zeiger auf einen Zeiger auf einen int ist aber nützlich. – Toad
Ich glaube nicht, dass ich in den über 25 Jahren, die ich in C programmiert habe, Code mit einem Zeiger auf ein Array schreiben musste (ich habe nur Triple Pointer verwendet - SomeType *** var - ein paar Mal, und änderte den Code, um sie zu vermeiden, sobald ich könnte.) –
@reinier: sicher, aber ich habe nicht gefragt, dass – zaharpopov