Der Nullzeiger
Eine Referenz muss immer zu einer Variablen gehören. Die Zeile int& r; endet mit dem Fehler declaration of reference variable 'r' requires an initializer (eine Referenz braucht einen Startwert). Ein Zeiger muss dagegen nicht irgendwohin zeigen. Dafür gibt es den Wert nullptr, den Nullzeiger:
int* aktuellerSpieler = nullptr;Er ist nützlich, wenn „nichts“ eine der Möglichkeiten ist. In einem Spiel zeigt der Zeiger aktuellerSpieler zum Beispiel auf den Punktestand des Spielers, der an der Reihe ist, und wenn das Spiel endet, ist niemand an der Reihe. Einen Zeiger kannst du auch auf eine andere Variable umlenken, was eine Referenz nicht kann: Eine Referenz gehört immer zu der Variablen, mit der sie erstellt wurde.
#include <iostream>
int main() {
int anna = 0;
int jonas = 0;
int* aktuellerSpieler = &anna;
*aktuellerSpieler = *aktuellerSpieler + 5;
aktuellerSpieler = &jonas;
*aktuellerSpieler = *aktuellerSpieler + 3;
aktuellerSpieler = nullptr;
std::cout << "Anna: " << anna << ", Jonas: " << jonas << std::endl;
if (aktuellerSpieler == nullptr) {
std::cout << "Spiel vorbei" << std::endl;
}
return 0;
}Das gibt aus:
Anna: 5, Jonas: 3
Spiel vorbeiBeachte den Unterschied: aktuellerSpieler = &jonas; ohne Sternchen ändert, worauf der Zeiger zeigt. *aktuellerSpieler = *aktuellerSpieler + 3; mit Sternchen ändert die Variable, auf die er zeigt.
Über nullptr zu lesen oder zu schreiben ist ein Fehler, denn dort gibt es keine Variable. Auf deinem Computer stürzt das Programm meistens ab, und das Terminal zeigt Segmentation fault. Hier im Browser kann es mit dem Fehler RuntimeError: unreachable anhalten oder sogar mit Unsinnswerten weiterlaufen. Wenn ein Zeiger also nullptr sein kann, prüfe ihn immer, bevor du ihn verwendest:
if (aktuellerSpieler != nullptr) {
std::cout << *aktuellerSpieler << std::endl;
} else {
std::cout << "Niemand ist dran" << std::endl;
}Ein Zeiger, dem du keinen Wert gibst (int* p;), enthält eine zufällige Adresse, genau wie eine nicht initialisierte Variable Zufallswerte enthält. Setze einen Zeiger also immer sofort: auf die Adresse einer Variablen oder auf nullptr.
So schreibst du es:
Anweisungen
- 1
Das Programm gibt
Punkte: 12aus und hält dann mit einem Fehler an, weilgibPunkteAusbeim zweiten Malnullptrbekommt und darüber liest. Füge der Funktion eine Prüfung hinzu: Istpunktegleichnullptr, gibt die FunktionNiemand ist dranaus, sonst gibt sie die Punkte wie vorher aus. Das Programm gibt dannPunkte: 12und danachNiemand ist dranaus. - 2
Jonas ist an der Reihe. Füge am Ende von
main(vorreturn 0;) eine Variablejonasmit dem Wert7hinzu, lenke den ZeigeraktuellerSpielerauf sie um und rufe noch einmalgibPunkteAus(aktuellerSpieler)auf. Das Programm gibtPunkte: 12,Niemand ist dranundPunkte: 7aus.