Adresy a ukazatele

Kromě referencí má C++ ještě jeden způsob, jak se dostat k proměnné odjinud: ukazatele. Abyste jim porozuměli, potřebujete vědět, co je adresa.

Každá proměnná leží v paměti počítače. Paměť si můžete představit jako dlouhou řadu očíslovaných přihrádek a číslu přihrádky, ve které proměnná leží, se říká adresa. Adresu proměnné získáte znakem & před jejím názvem:

#include <iostream>

int main() {
    int vek = 15;
    std::cout << vek << std::endl;
    std::cout << &vek << std::endl;
    return 0;
}

Tento kód vypíše například:

15
0xfff4

Adresa se vypisuje v šestnáctkové soustavě, proto 0x na začátku a písmena mezi číslicemi. Na vašem počítači bude jiná a delší, třeba 0x7ffc1b2a3c4c. Jaké číslo to je, vás zajímat nemusí. Důležité je, že adresu můžete uložit do proměnné a přes ni se k proměnné dostat.

Proměnné, ve které je uložená adresa, se říká ukazatel (anglicky pointer). Její typ se skládá z typu proměnné, na kterou ukazuje, a hvězdičky. Ukazatel na int má typ int*, ukazatel na double typ double*:

int vek = 15;
int* ukazatel = &vek;

Druhý řádek čtěte: „ukazatel je ukazatel na int a obsahuje adresu proměnné vek“. Říká se, že ukazatel ukazuje na vek.

K proměnné, na kterou ukazatel ukazuje, se dostanete hvězdičkou před ukazatelem: *ukazatel. Takto ji můžete číst i do ní zapisovat:

#include <iostream>

int main() {
    int vek = 15;
    int* ukazatel = &vek;

    std::cout << *ukazatel << std::endl;
    *ukazatel = 16;
    std::cout << vek << std::endl;
    return 0;
}

Tento kód vypíše:

15
16

Příkaz *ukazatel = 16; zapsal 16 do proměnné, na kterou ukazatel ukazuje, tedy do vek. Je to podobné jako u reference, jen hvězdičku musíte psát pokaždé.

Časté chyby:

  • int* ukazatel = vek; bez & skončí chybou cannot initialize a variable of type 'int *' with an lvalue of type 'int': do ukazatele patří adresa, ne číslo.
  • ukazatel = 16; bez hvězdičky skončí chybou incompatible integer to pointer conversion assigning to 'int *' from 'int': zkoušíte zapsat číslo do samotného ukazatele místo do proměnné, na kterou ukazuje.
  • Typ ukazatele musí odpovídat typu proměnné. double cena = 9.5; a pak int* ukazatel = &cena; skončí chybou cannot initialize a variable of type 'int *' with an rvalue of type 'double *'. Na double ukazuje double*.
  • Když vypíšete ukazatel bez hvězdičky, program nespadne, ale místo hodnoty vypíše adresu, třeba 0xfff4.

Pokyny

Pod proměnnou hodnota vytvořte ukazatel typu int* s názvem ukazatel, který ukazuje na hodnota.

Pod ním pomocí ukazatele změňte hodnotu proměnné na 10. Do proměnné hodnota nezapisujte přímo, zapište do ní přes *ukazatel. Program pak vypíše Hodnota proměnné: 10.

Na konec programu (před return 0;) přidejte výpis přes ukazatel: text Přes ukazatel: a hodnotu, na kterou ukazatel ukazuje. Program vypíše Hodnota proměnné: 10 a pod tím Přes ukazatel: 10.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

Zpět

5/10

Další