Arrays nutzen das Modell des linearen Speichers, d.h., ein im Index nachfolgendes Element ist auch physisch im unmittelbar nachfolgenden Speicherbereich abgelegt. Dieser Fakt erlaubt die Interpretation von Zeigervariablen als Arraybezeichner und umgekehrt.
{ const int N = 10; int a[N], *pint; // array and pointer pint = &a[0]; // init pointer }
Arraybezeichner werden prinzipiell als Zeiger behandelt, daher ist die Programmzeile
pint = &a[0];
identisch mit
pint = a;
Folgerichtig stellen daher die Ausdrücke a[1] , *(a+1) , *(pint+1) , pint[1] den identischen Zugriff auf das Feldelement a1 dar.
Die Adresse welche durch (pint+1) dargestellt wird ergibt sich zu (Adresse in pint) + sizeof(int). Dabei bezeichnet int den Datentyp, auf welchen der Zeiger pint verweist. Der Zugriff auf andere Feldelemente ai, i = 0 … N-1 ist analog.
Die folgenden Operatoren sind auf Zeiger anwendbar:
== , != , < , > , ⇐ , >=+ und Subtraktion -++ , Dekrement -- und zusammengesetzte Operatoren += , -=Zur Demonstration betrachten wir ein Beispiel, in welchem ein Feld erst auf konventionelle Weise definiert und initialisiert wird um danach mittels Zeigeroperationen ausgegeben zu werden.
// Pointers and arrays #include <iostream.h> main() { const int N=10; double a[N], *pa, *pp, *pi; int i; // initialize a pa = a; for (i=0;i<N;i++) *(pa+i)=(i+1)*(i+1); // a[i] = ... // output a; // pointer pi as loop variable pp = a+N-1; // pointer at last element of a for (pi=a;pi<=pp;pi++) cout<<" "<<*pi << endl; }