X
    Categories: Technik

Einführung in Zeiger

Hier erfahren Sie, was Zeiger (Pointer) sind und welche Zugriffsarten auf Zeiger existieren.

Zeiger (auch: Pointer) gelten als eines der schwierigsten Themen in der Programmiersprache C / C++. Dennoch spielen sie eine nicht zu unterschätzende Rolle in der Programmierung.

Was sind Zeiger?

Wiederholen wir zu Beginn noch einmal den Begriff der Variablen, dem fundamentalen Baustein eines jeden Programms. Mit Hilfe einer Variablen wird Speicher reserviert, den Sie in Ihrem Programm verwenden können. Wenn Sie mit der Variablen arbeiten, greifen Sie direkt ohne Umwege auf den ensprechenden Speicher zu. Somit hat eine Variable einen Wert und eine Speicheradresse. Sie können sich die Speicheradresse einer Variablen mit Hilfe des Operators & anzeigen lassen:

int myVar = 5;

cout << „Wert: “ << myVar << endl;

cout << „Speicheradresse: “ << &myVar << endl;

Zeiger funktionieren jedoch anders. Sie sind in erster Linie auch Variablen, allerdings wird über sie nicht direkt auf den Speicher zugegriffen. Zeiger enthalten als Wert eine Speicheradresse einer anderen Variablen. Auf Bild 1 können Sie diesen Sachverhalt sehen.

myVar hat die Speicheradresse ABC und den Wert 5. Das ist eine Variable, wie wir sie gewöhnt sind. myPointer befindet sich an Speicheradresse DEF und enthält den Wert ABC. Da Zeiger nur Speicheradressen enthalten können, weiß der Compiler, dass myPointer auf die Variable myVar verweist, denn myVar steht an Speicheradresse ABC.

Mit Hilfe von Zeigern können Sie also indirekt auf Variablen zugreifen. Dabei ist es natürlich möglich, mehrere Zeiger auf dieselbe Adresse zeigen zu lassen. In Bild 2 ist ein weiter Pointer hinzugekommen. myPointer2 steht an Adresse ABA und enthält ebenfalls die Adresse ABC.

Zugriffe auf Zeiger

Auf Zeiger können Sie auf mehrere Arten zugreifen:

  1. Die Adresse des Zeigers selbst. Das wäre im obigen Beispiel für myPointer die Speicheradresse DEF.
  2. Die Adresse des Objekts, auf welches der Zeiger verweist (referenziert). Für myPointer ist das die Adresse ABC. Bedenken Sie, dass dies der Inhalt der Zeigervariablen ist.
  3. Der Wert des referenzierten Objekts: Das ist der Wert der Variable, auf die der Zeiger verweist. Im Beispiel wäre das also 5. Diesen Zugriff auf den Wert der referenzierten Variablen bezeichnet man als „Dereferenzierung“ – die Referenz wird aufgelöst.

Vor- und Nachteile von Zeigern

Zeiger haben viele Vorteile, aber auch ganz klare Nachteile, über die Sie sich unbedingt bewusst sein müssen. Ein ganz großer Vorteil ist, dass Zeiger dynamische Speicherplatzreservierung ermöglichen. Der dynamisch reservierte Speicher kann während des Programmablaufs wieder freigegeben werden. Durch die Zeigerarithmetik können Sie einfach durch zusammenhängende Speicherbereiche navigieren wie z.B. Arrays. Zeiger ermöglichen auch sehr dynamische Datenstrukturen wie verkettete Listen. In verketteten Listen ist es möglich, Datenobjekte so miteinander zu verbinden, dass Sie relativ einfach durch die Struktur navigieren können. Außerdem sind Zeiger wichtig bei der Übergabe von Arrays und Objekten an Unterprogramme.

Doch bei all den Vorteilen haben Zeiger auch sehr erhebliche Nachteile. Der Umgang mit Pointern ist relativ schwierig zu erlernen, weil man auf viele Aspekte achten muss. Kleine Flüchtigkeitsfehler können gravierende Konsequenzen haben und nur sehr schwer zu korrigieren sein. Es ist möglich, dass der Speicher fragmentiert wird. Dann steht zwar theoretisch noch genug Speicher zur Verfügung, aber nur in kleinen Fragementen und nicht in zusammenhängenden Speicherbereichen.

Wegen dieser Nachteile verzichten viele Programmiersprachen wie z.B. Java auf Zeiger. Zwar existieren intern in Java auch Pointer, aber der Programmierer gerät nicht mit ihnen in Berührung. In C / C++ spielen sie allerdings eine große Rolle. Sie sollten wegen der gravierenden Nachteile den Einsatz von Zeigern vermeiden, wenn dies möglich ist. C++ bietet im Gegensatz zu C die sogenannten Referenzen an – eine wesentlich einfachere Variante, die oft als Ersatz für Pointer eingesetzt werden kann. Wenn möglich, sollten Sie auf jeden Fall Referenzen den Zeigern vorziehen.