In dem Beispiel sollen zwei Tatsachen herausstechen. Zum Einen lässt sich das Klavier nicht wirtschaftlich transportieren, bei der Tatsache dass es nur gestimmt werden soll. Zum Anderen benötigt Kurt eine Wegbeschreibung, um zu dem Klavier zu gelangen.
In der Programmierung haben wir ähnliche Probleme. Zum Beispiel arbeiten wir später mit großen Datenmengen, welche von Funktionen bearbeiten werden. Würden wir diese Datenmengen als Paket zu den Funktionen transportieren, geht dies sehr stark zu Lasten der Performance und des Speicherplatzes. Um dem vorzubeugen, verwenden wir Zeiger.
- Das Klavier ist im Prinzip unsere Datenmenge
- Die Wegbeschreibung ist im Prinzip unser Zeiger
Unsere Datenmengen liegen im Speicher und haben eine Adresse. Ein Zeiger „zeigt“ auf die Menge, indem er lediglich die Adresse der Menge speichert. Wenn wir dann einer Funktion unsere Datenmenge überliefern möchten, teilen wir ihr lediglich mit dem Zeiger die Adresse mit. Die Datenmenge wird somit nicht transportiert, stattdessen greift die Funktion über die Adresse auf die Daten zu. Diese Datenmengen werden durch Variablen repräsentiert. Ein Zeiger speichert also nur die Adresse einer anderen Variablen und leitet somit die Anfrage auf einen Wert weiter.
In den nächsten Kapiteln werden wir erfahren, wie man theoretisch mit einer einzigen Variablen den kompletten Speicherplatz des Computer belegen kann. Hier folgt jetzt aber erstmal ein kleines Beispiel zum Thema Zeiger.
Beispiel mit Zeiger
Wir erstellen zuerst eine Variable und setzen sie auf einen Wert. Danach erstellen wir einen Zeiger, der auf die Variable zeigen soll. Ein Zeiger sollte vom gleichen Datentyp sein, wie die Variable, auf die er zeigt. Einen Zeiger erstellen wir, indem wir bei der Deklaration den Namen mit einem Stern * beginnen. Danach existiert dieser Zeiger, allerdings zeigt er auf keinen sinnvollen Wert. Wir müssen ihn also noch auf die Adresse der Variablen setzen. Diese erhalten wir mit dem Kaufmanns-Und &.
int zahl = 7; int *zeiger; zeiger = &zahl; printf("Zeiger-Wert: %d\n", *zeiger);
Zeiger-Wert: 7
Ein Zeiger repräsentiert eine Adresse und nicht wie eine Variable einen Wert. Will man auf den Wert der Adresse zugreifen, auf die ein Zeiger zeigt, muss der Stern * vor den Namen gesetzt werden.