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
0xfff4Adresa 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
16Pří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čí chyboucannot 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čí chybouincompatible 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 pakint* ukazatel = &cena;skončí chyboucannot initialize a variable of type 'int *' with an rvalue of type 'double *'. Nadoubleukazujedouble*. - Když vypíšete
ukazatelbez hvězdičky, program nespadne, ale místo hodnoty vypíše adresu, třeba0xfff4.
Jak psát:
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.