Arrays & Pointer

Man kann Arrays auch in gewisser weise als Pointer sehen. Ein Array teilt gewisse Eigenschaften mit einem Pointer, und ein dynamisch mit new auf dem Heap erzeugtes Array wird in einem Pointer gespeichert. Ein großer Unterschied jedoch ist, das das Array einen Block von n Elementen im Speicher darstellt, während ein Pointer häufig nur auf eine bestimmte Stelle im Speicher zeigt. Es lässt sich aber zum Beispiel mit einem Pointer durch ein Array navigieren:
int arr[10];
for(int i =0; i < 10; ++i)//(1)
    arr[i]=i;
int* pi = arr;//(2)
for(int i =0; i < 10; ++i,++pi)//(3)
    std::cout << pi << " : " << *pi << std::endl;//(4)


  1. Das int Array arr wird entsprechend initialisiert.
  2. Ein Pointer vom Typ int wird erstellt, und zeigt nun auf das erste Arrayelement. Bei einem Array wird hierbei der Adressoperator nicht benötigt, da das Array selber sich hier mehr wie ein Pointer als eine normale Variable verhält. Um auf den Inhalt des Arrays zu zugreifen, benötigt man ja den Indexoperator [].
  3. Wieder eine for Schleife, welche von 0 – 9 hoch zählt. Im letzten Teil im Kopf einer solchen for Schleife kann man eine (oder mehrere mit Komma getrennte) Operationen an verschiedenen Variablen vornehmen. Hier wird der Zähler i um eins erhöht. Aber was geschieht hier mit dem Pointer pi? Auch pi wird um „eins“ erhöht. Ein Pointer kann mit dem ++ Operator auf die nächste Stelle im Speicher verschoben werden, und genau dies wird hier genutzt um durch alle Arrayelemente zu navigieren.
  4. Die Ausgabe, hier wird einmal die aktuelle Adresse von pi ausgegeben, sowie deren Inhalt im Speicher.
Das Programm erzeugt folgende Ausgabe:
0x28ff08 : 0
0x28ff0c : 1
0x28ff10 : 2
0x28ff14 : 3
0x28ff18 : 4
...
0x28ff2c : 9


Man beachte wie sich die Speicheradresse für des int Pointer pi immer um 4 Byte weiter im Speicher bewegt. Das Beispiel zeigt auch, das sich Pointer entsprechend manipulieren lassen, so das sie sich auf eine neue Stelle im Speicher beziehen. Auch der Indexoperator eines Arrays ist eigentlich nichts anderes als eine andere Syntax für *(arr+index):
for(int i =0; i < 10; ++i)
    std::cout << *(arr+i) << " " << arr[i] << std::endl;


Das Beispiel gibt die Zahlen 0 - 9 jeweils zweimal aus, einmal über Pointerarithmetik, und einmal den Indexoperator.