Č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:
16Hvě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á „pje ukazatel“. - Před ukazatelem kdekoli jinde:
*pje hodnota, na kterou ukazuje. - Mezi dvěma hodnotami:
cena * 2je 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čí chybouformat specifies type 'int' but the argument has type 'int *':%dčekáint, alepje adresa.p * 2skončí chybouinvalid operands to binary expression ('int *' and 'int'). Operandy jsou hodnoty kolem operátoru, tadypa2, a adresu násobit nejde.
Jak psát:
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
3/11