Čtení přes ukazatel

Ukazatel ví, kde proměnná je. Hodnotu z její přihrádky získáte hvězdičkou před ukazatelem: *p znamená „hodnota, na kterou p ukazuje“. Získání hodnoty z adresy se říká dereference ukazatele.

#include <stdio.h>

int main(void) {
    int vek = 15;
    int *p = &vek;
    printf("%d\n", *p);
    printf("%d\n", *p + 1);
    return 0;
}

Tento kód vypíše:

15
16

*p je int, takže ho vypíšete pomocí %d a počítáte s ním jako s každým jiným celým číslem.

Znaky & a * jsou protiklady. & se ptá „kde to je?“ a z proměnné udělá její adresu. * se ptá „co tam je?“ a z adresy udělá zpátky hodnotu. Proto je *&vek zase jen vek.

Ukazatel si hodnotu nekopíruje. Zná jen adresu a *p se do přihrádky podívá pokaždé znovu. Když se proměnná změní, *p dá novou hodnotu:

int vek = 15;
int *p = &vek;
vek = 16;
printf("%d\n", *p);

Tento kód vypíše:

16

Hvězdička teď má tři významy. Rozhoduje, kde stojí:

  • V deklaraci, za typem: int *p = &vek; vytvoří ukazatel. Hvězdička tu říká „p je ukazatel“.
  • Před ukazatelem kdekoli jinde: *p je hodnota, na kterou ukazuje.
  • Mezi dvěma hodnotami: cena * 2 je obyčejné násobení.

*p * 2 tedy znamená „hodnota, na kterou ukazuje p, krát dvě“. První hvězdička získá hodnotu z adresy, druhá násobí.

Typická chyba je zapomenutá hvězdička. Pak pracujete s adresou místo s hodnotou a překladač vám to řekne:

  • printf("%d\n", p); skončí chybou format specifies type 'int' but the argument has type 'int *': %d čeká int, ale p je adresa.
  • p * 2 skončí chybou invalid operands to binary expression ('int *' and 'int'). Operandy jsou hodnoty kolem operátoru, tady p a 2, a adresu násobit nejde.

Pokyny

Program se nepřeloží. Přečtěte si chybovou hlášku a opravte poslední printf tak, aby vypsal hodnotu, na kterou p ukazuje, a ne adresu. Program vypíše Skóre: 50 a Přes ukazatel: 50.

Pod něj vypište dvojnásobek skóre, opět přes ukazatel: text Dvojnásobek: a *p * 2. Program vypíše na dalším řádku Dvojnásobek: 100.

Pod to změňte skóre přímo, bez ukazatele: skore = 60;. Pak vypište text Teď: a *p. Přes ukazatel dostanete novou hodnotu: Teď: 60.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

3/11