Erst einmal zur Klarstellung:
Ja, C unterscheidet zwischen
- einem Array,
- einem Pointer auf dieses Array und
- einem Pointer auf dessen erstes Element.
Beim Pointer auf ein Array kann man noch unterscheiden, ob dieses Array
eine spezifizierte Größe hat oder nicht.
Ein Pointer auf ein Array mit unspezifizierter Größe (wie p1_array in
Heikos Beispiel) unterscheidet sich von einem Pointer auf das erste
Array-Element im Wesentlichen in den folgenden Punkten:
- Beim Zugriff auf ein Array-Element muss der Pointer vor der
Indizierung erst dereferenziert werden:
Diese Dereferenzierung ist aber rein formaler Natur und schlägt sich
nicht im erzeugten Binärcode nieder, da ein Pointer auf das Array und
ein Pointer auf dessen erstes Element zwar unterschidlichen Typs, aber
numerisch identisch sind.
- Da der Pointer auf einen unvollständigen Typ (nämlich ein Array mit
unspezifizierter Größe) zeigt, kann die Größe des Arrays nicht mit
sizeof bestimmt werden:
1 | sizeof *p1_pointer // Fehler
|
- Aus demselben Grund kann der Pointer auch nicht indiziert werden:
1 | p1_pointer[i] // Fehler
|
Vielleicht drückt in Heikos Beispiel die Verwendung eines Pointers auf
ein Array statt eines Pointers auf dessen erstes Element die Absicht des
Programmierers besser aus. In der Praxis macht das aber niemand so,
allein schon wegen der umständlicheren Schreibweise bei den Array-
Zugriffen.