Helmichs Informatik-Lexikon

Zeiger

Kurzdefinition

Unter einem Zeiger (engl. pointer) versteht man ein Attribut oder eine Variable, in der keine Daten im eigentlichen Sinne gespeichert sind (zum Beispiel eine int-Zahl, ein Name oder eine Adresse), sondern Speicheradressen von anderen, eigentlichen Daten.

Zeiger und Referenzen

Einige Fachbücher der Informatik unterscheiden streng zwischen Zeigern und Referenzen; meistens wird dann wie folgt argumentiert:

Zeiger sind mächtiger als Referenzen. Ein Zeiger speichert nicht nur die Adresse einer anderen Datenstruktur, sondern man kann diese Adresse auch arithmetisch verändern, beispielsweise um 4 oder 8 inkrementieren. Man spricht hier von einer Zeigerarithmetik. Befinden sich zum Beispiel vier Variablen a, b, c und d im Arbeitsspeicher und ist jede Variable 16 Bit breit, und hat man ferner einen Zeiger auf die Variable a, so würde die Operation a++  einen Zeiger liefern, der auf die Variable b zeigt, vorausgesetzt, a würde durch den ++-Operator um 2 Byte inkrementiert.

Referenzen dagegen speichern die Adresse einer Datenstruktur, können aber nicht verändert werden. Man kann die Speicheradresse nur auslesen, aber keine neue Adresse in die Referenz hineinschreiben. Eine Zeigerarithmetik ist mit Referenzen also nicht möglich.

In Java wird jedes Mal, wenn Sie einen Array oder ein Objekt deklarieren, eine Referenz auf den eigentlichen Speicherbereich erzeugt, in dem sich der Array bzw. das Objekt befindet.

Beispiel

Betrachten Sie den Quelltext der Klasse Stack aus der Folge 17 (Zeigerstrukturen):

public class Stack
{
   Element TOS; 

   public Stack()
   {
      TOS = null;
   }

   public void push(int v)
   {
      Element h;

      h = new Element();
      h.value = v;
      h.next = TOS;
      TOS = h;
   }
   …

}

Weitere Einzelheiten hierzu siehe Folge 17. Sehen wir uns folgende Zeile einmal näher an:

TOS = null;

Das Attribut TOS ist eine Referenz auf ein Objekt der Klasse Element, enthält also die Speicheradresse eines solchen Objektes. Die obige Zeile ist aber eine Zuweisung. Das heißt, dass der Wert der Referenz, die gespeicherte Adresse also, verändert werden kann. Egal, welche Adresse zuvor in TOS gespeichert war, nach Ausführen der Zuweisung hat sie den Wert null. Also wurde schreibend auf die Speicheradresse zugegriffen; wir haben es daher mit einem echten Zeiger (Pointer) zu tun. Nichts anderes passiert bei der Anweisung

TOS = h;

Auch hier wird der bisherige Wert von TOS überschrieben, durch einen neuen Wert ersetzt.