10    Zeiger (Pointer)

In diesem Kapitel wird eines der wichtigsten Themen in C behandelt. Es geht um Zeiger, ohne die Sie viele (komplexere) Dinge einfach nicht tun können. Zeiger werden auch Pointer genannt und stellen einen Verweis auf eine bestimmte Speicheradresse dar, in der z. B. ein Wert steht. Haben Sie die Zeigerarithmetik erst einmal verstanden, sind auch fortgeschrittene Themen keine so große Hürde mehr. Es folgt ein kleiner Überblick über die wichtigsten Dinge, die Sie mit Zeigern realisieren können.

10.1    Zeiger vereinbaren

Wenn Sie verstehen, dass Zeiger lediglich die Adresse und den Typ eines Speicherobjekts darstellen, haben Sie das Wichtigste verstanden. Die Definition eines solchen Zeigers sieht wie folgt aus:

Datentyp *name;

Am Stern * zwischen Datentyp und name können Sie den Zeiger erkennen. Der name ist der Bezeichner und wird als Zeiger auf einem Typ Datentyp deklariert. Für name gelten alle üblichen Regeln, die schon in Abschnitt 2.4.1, »Bezeichner«, beschrieben wurden. Zusätzlich können bei den Zeigern auch noch die Typ-Qualifizierer const, volatile oder restrict verwendet werden.

Wohin Zeiger zeigen

Bei der Verwendung von Zeigern ist häufig die Rede von »zeigen auf«. Dies hilft ungemein, das Thema besser zu verstehen. Ein Prozessor kann natürlich nicht im bildlichen Sinne »zeigen«. Wenn Sie also »auf etwas zeigen« lesen, ist damit gemeint, dass ein bestimmter Speicherbereich, also eine Adresse im Arbeitsspeicher referenziert wird.

Ein einfaches Beispiel:

int *iptr;

Hier wurde ein Zeiger mit dem Namen iptr erstellt, der auf ein Speicherobjekt vom Typ int verweisen kann. Noch genauer gesagt, kann dieser die Adresse eines int-Objekts speichern.

Aber halt: Stehen nicht auch Zeiger in der Variablentabelle? Und wenn dies so ist, müsste im Falle eines Zeigers doch zweimal auf den Speicher zugegriffen werden, nämlich einmal, um die Variable auszulesen (die hier eben ein Zeigertyp ist), und ein zweites Mal, um die Adresse auszulesen, auf die der Zeiger zeigt. Die Antwort ist, dass dies genau so ist, und dass der Prozessor sogar Befehle kennt, um eine Adresse auszulesen, die in einer anderen Adresse steht. Dies nennt man indirekte Adressierung, und im Falle eines Zeigers handelt es sich sogar um eine doppelt indirekte Adressierung. Da der Zugriff auf einen Zeiger also immer indirekt ist, nennt man den *-Operator auch Indirektionsoperator. Eventuell werden Sie in Internetforen auf diesen Begriff treffen, wenn Sie nach »Zeiger« suchen, und wir möchten vermeiden, dass Sie sich in diesem Fall zu sehr wundern.