Zeiger und Arrays - Zeigerarithmetik

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.

Testprogramm

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:

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;
}

gesamtes Programm