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é.

Řada čtyř očíslovaných přihrádek v paměti. V přihrádce s adresou 0xfff8 je 80 a patří proměnné skore. V přihrádce s adresou 0xfffc je 15 a patří proměnné vek.

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: 0xfff8

Adresy 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čí chybou format specifies type 'void *' but the argument has type 'int'. Značka %p čeká adresu (void * je v jazyce C zápis pro „adresu čehokoli“), ale vek je int, tedy číslo 15.
  • Opačná chyba: printf("%d\n", &vek); skončí chybou format specifies type 'int' but the argument has type 'int *'. Značka %d čeká celé číslo, ale &vek je adresa. Typ int * znamená „adresa proměnné typu int“ a podrobně ho poznáte v dalším cvičení.

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

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

Nebo se registrujte pomocí:

1/11