Prázdný ukazatel
Reference musí vždy patřit k nějaké proměnné. Řádek int& r; skončí chybou declaration of reference variable 'r' requires an initializer (reference potřebuje počáteční hodnotu). Ukazatel ale nemusí ukazovat nikam. K tomu slouží hodnota nullptr (z anglického null pointer, prázdný ukazatel):
int* naTahu = nullptr;Hodí se, když „nic“ je jedna z možností. Třeba ve hře ukazatel naTahu ukazuje na body hráče, který je právě na tahu, a když hra skončí, není na tahu nikdo. Ukazatel také můžete přesměrovat na jinou proměnnou, což reference neumí: reference patří pořád k té proměnné, se kterou vznikla.
#include <iostream>
int main() {
int anna = 0;
int petr = 0;
int* naTahu = &anna;
*naTahu = *naTahu + 5;
naTahu = &petr;
*naTahu = *naTahu + 3;
naTahu = nullptr;
std::cout << "Anna: " << anna << ", Petr: " << petr << std::endl;
if (naTahu == nullptr) {
std::cout << "Hra skončila" << std::endl;
}
return 0;
}Tento kód vypíše:
Anna: 5, Petr: 3
Hra skončilaVšimněte si rozdílu: naTahu = &petr; bez hvězdičky změní, kam ukazatel ukazuje. *naTahu = *naTahu + 3; s hvězdičkou změní proměnnou, na kterou ukazuje.
Číst nebo zapisovat přes nullptr je chyba, protože tam žádná proměnná není. Na vašem počítači program obvykle spadne a v terminálu uvidíte Segmentation fault. Tady v prohlížeči může skončit chybou RuntimeError: unreachable, nebo dokonce pokračovat s nesmyslnými hodnotami. Proto ukazatel, který může být nullptr, před použitím vždy zkontrolujte:
if (naTahu != nullptr) {
std::cout << *naTahu << std::endl;
} else {
std::cout << "Nikdo není na tahu" << std::endl;
}Ukazatel, kterému nedáte žádnou hodnotu (int* p;), obsahuje náhodnou adresu, stejně jako neinicializovaná proměnná obsahuje nesmysl. Ukazatel proto vždy hned nastavte: na adresu proměnné, nebo na nullptr.
Jak psát:
Pokyny
Program vypíše Body: 12 a pak skončí chybou, protože funkce vypisBody podruhé dostane nullptr a čte přes něj. Doplňte do funkce kontrolu: když je body rovno nullptr, funkce vypíše Nikdo není na tahu, jinak vypíše body jako dosud. Program pak vypíše Body: 12 a pod tím Nikdo není na tahu.
Na tah přichází Petr. Na konec main (před return 0;) přidejte proměnnou petr s hodnotou 7, přesměrujte na ni ukazatel naTahu a znovu zavolejte vypisBody(naTahu). Program vypíše Body: 12, Nikdo není na tahu a Body: 7.
Začněte programovat zdarma
8/10