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čila

Vš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.

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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

8/10