Adresy v paměti
Vítejte v lekci o ukazatelích. Pro mnoho lidí jsou ukazatele nejtěžší částí jazyka C, a proto půjdeme pomalu, v každém cvičení jen malý krok. Vyplatí se to: díky ukazatelům může funkce měnit vaše proměnné a pochopíte, jak doopravdy fungují pole.
Všechno začíná pamětí. Za běhu programu jsou jeho proměnné uložené v paměti počítače. Paměť si můžete představit jako dlouhou řadu očíslovaných přihrádek, podobně jako šatní skříňky na školní chodbě. Každá proměnná dostane svou přihrádku a číslu této přihrádky se říká adresa proměnné.
Adresu proměnné získáte tak, že před její název napíšete &: &vek znamená „adresa proměnné vek“. Adresu vypíšete formátovací značkou %p (p jako anglické pointer, ukazatel), stejně jako celé číslo vypisujete značkou %d:
#include <stdio.h>
int main(void) {
int vek = 15;
int skore = 80;
printf("vek: %d\n", vek);
printf("Adresa vek: %p\n", &vek);
printf("Adresa skore: %p\n", &skore);
return 0;
}Tento kód vypíše:
vek: 15
Adresa vek: 0xfffc
Adresa skore: 0xfff8Adresy se vypisují v šestnáctkové soustavě, proto začínají 0x a mezi číslicemi mohou být písmena a až f. Číst je nemusíte. Na vašem počítači by byly mnohem delší, třeba 0x7ffd5e8c3a4c, a mohly by se dokonce měnit při každém spuštění programu. Důležité jsou jen dvě věci: každá proměnná má adresu a různé proměnné mají různé adresy.
Obě adresy se liší o 4, protože int zabírá v paměti 4 bajty (bajt je nejmenší jednotka paměti). Bajty počítat nemusíte, to za vás udělá počítač.
Znak & před proměnnou nemá nic společného s && z podmínek. Jeden & těsně před názvem proměnné znamená „adresa“.
Na co si dát pozor:
- Když
&zapomenete, překladač vás zastaví.printf("%p\n", vek);skončí chybouformat specifies type 'void *' but the argument has type 'int'. Značka%pčeká adresu (void *je v jazyce C zápis pro „adresu čehokoli“), alevekjeint, tedy číslo 15. - Opačná chyba:
printf("%d\n", &vek);skončí chybouformat specifies type 'int' but the argument has type 'int *'. Značka%dčeká celé číslo, ale&vekje adresa. Typint *znamená „adresa proměnné typuint“ a podrobně ho poznáte v dalším cvičení.
Jak psát:
Pokyny
Na konec programu (před return 0;) vypište adresu proměnné zivoty: text Adresa zivoty: a značku %p s &zivoty. Program pak vypíše ještě řádek jako Adresa zivoty: 0xfffc (číslo může být jiné).
Pod něj stejným způsobem vypište adresu proměnné mince, s textem Adresa mince: . Adresy budou různé, protože každá proměnná má svou vlastní přihrádku.
Začněte programovat zdarma
1/11