Adressen und Zeiger
Neben Referenzen gibt es in C++ noch eine Möglichkeit, von woanders auf eine Variable zuzugreifen: Zeiger (englisch pointers). Um sie zu verstehen, musst du wissen, was eine Adresse ist.
Jede Variable lebt im Speicher des Computers. Du kannst dir den Speicher als lange Reihe nummerierter Kästchen vorstellen, und die Nummer des Kästchens, in dem eine Variable lebt, heißt ihre Adresse. Die Adresse einer Variablen bekommst du mit dem Zeichen & vor ihrem Namen:
#include <iostream>
int main() {
int alter = 15;
std::cout << alter << std::endl;
std::cout << &alter << std::endl;
return 0;
}Das gibt zum Beispiel aus:
15
0xfff4Die Adresse wird als Hexadezimalzahl ausgegeben, deshalb beginnt sie mit 0x und kann Buchstaben unter den Ziffern haben. Auf deinem Computer ist sie anders und länger, zum Beispiel 0x7ffc1b2a3c4c. Welche Zahl es ist, musst du nicht wissen. Wichtig ist, dass du eine Adresse in einer Variablen speichern und darüber auf die Variable zugreifen kannst.
Eine Variable, die eine Adresse speichert, heißt Zeiger. Ihr Typ ist der Typ der Variablen, auf die sie zeigt, gefolgt von einem Sternchen. Ein Zeiger auf einen int hat den Typ int*, ein Zeiger auf einen double den Typ double*:
int alter = 15;
int* zeiger = &alter;Lies die zweite Zeile als „zeiger ist ein Zeiger auf einen int und enthält die Adresse der Variablen alter“. Wir sagen, dass zeiger auf alter zeigt.
Auf die Variable, auf die ein Zeiger zeigt, greifst du mit einem Sternchen vor dem Zeiger zu: *zeiger. So kannst du sie lesen und auch beschreiben:
#include <iostream>
int main() {
int alter = 15;
int* zeiger = &alter;
std::cout << *zeiger << std::endl;
*zeiger = 16;
std::cout << alter << std::endl;
return 0;
}Das gibt aus:
15
16Die Anweisung *zeiger = 16; hat 16 in die Variable geschrieben, auf die der Zeiger zeigt, also in alter. Das ist ähnlich wie bei einer Referenz, nur musst du jedes Mal das Sternchen schreiben.
Häufige Fehler:
int* zeiger = alter;ohne&endet mit dem Fehlercannot initialize a variable of type 'int *' with an lvalue of type 'int': Ein Zeiger enthält eine Adresse, keine Zahl.zeiger = 16;ohne das Sternchen endet mit dem Fehlerincompatible integer to pointer conversion assigning to 'int *' from 'int': Du versuchst, eine Zahl im Zeiger selbst zu speichern statt in der Variablen, auf die er zeigt.- Der Typ des Zeigers muss zum Typ der Variablen passen.
double preis = 9.5;gefolgt vonint* zeiger = &preis;endet mit dem Fehlercannot initialize a variable of type 'int *' with an rvalue of type 'double *'. Eindoublebraucht einendouble*. - Gibst du
zeigerohne das Sternchen aus, stürzt das Programm nicht ab, gibt aber statt des Werts die Adresse aus, zum Beispiel0xfff4.
So schreibst du es:
Anweisungen
- 1
Erstelle unter der Variablen
werteinen Zeiger vom Typint*mit dem Namenzeiger, der aufwertzeigt. - 2
Ändere darunter mit dem Zeiger den Wert der Variablen auf
10. Schreibe nicht direkt inwert, sondern über*zeiger. Das Programm gibt dannWert der Variablen: 10aus. - 3
Gib am Ende des Programms (vor
return 0;) über den Zeiger aus: den TextÜber den Zeiger:und den Wert, auf denzeigerzeigt. Das Programm gibtWert der Variablen: 10und dannÜber den Zeiger: 10aus.