{ const int N = 10; int f[N], *pint; // array and pointer pint = &f[0]; // init pointer } |
Feldbezeichner werden prinzipiell als Zeiger behandelt, daher ist die
Programmzeile
pint = &f[0];
identisch mit
pint = f;
Folgerichtig stellen daher die Ausdrücke
f[1]
, *(f+1)
, *(pint+1)
, pint[1]
den identischen Zugriff auf das Feldelement f1 dar.
(siehe Ex630.cc)
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 fi,
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. (siehe Ex630.cc)
// Pointers and arrays #include <iostream.h> main() { const int N=10; double x[N], *px, *pp, *pi; int i; // initialize x px = x; for (i = 0; i < N; i++ ) { *(px+i) = (i+1)*(i+1); // x[i] = ... } // output x; // pointer pi as loop variable pp = x+N-1; // pointer at last element of x for ( pi = x; pi <= pp; pi++) { cout << " " << *pi << endl; } } |