Ukazatel jako parametr
Zatím byly ukazatel i jeho proměnná v main a proměnnou jste mohli změnit i přímo. Teď přichází hlavní důvod, proč ukazatele existují. Z lekce o funkcích víte, že parametr je kopie argumentu. Když funkce svůj parametr změní, proměnná toho, kdo funkci zavolal, zůstane stejná:
#include <stdio.h>
void pridej_bonus(int body, int bonus) {
body += bonus;
}
int main(void) {
int skore = 10;
pridej_bonus(skore, 5);
printf("Skóre: %d\n", skore);
return 0;
}Tento kód vypíše:
Skóre: 10Funkce dostala číslo 10, ne proměnnou skore. Je to jako dát někomu okopírovaný test: ať do kopie napíše cokoli, váš originál zůstane, jak byl.
Řešení: dejte funkci adresu proměnné. S adresou se funkce dostane do přihrádky volajícího a může změnit, co v ní je:
#include <stdio.h>
void pridej_bonus(int *body, int bonus) {
*body += bonus;
}
int main(void) {
int skore = 10;
pridej_bonus(&skore, 5);
pridej_bonus(&skore, 3);
printf("Skóre: %d\n", skore);
return 0;
}Tento kód vypíše:
Skóre: 18Změnily se tři věci: parametr je ukazatel int *body, uvnitř funkce je *body proměnná volajícího a při volání se předává adresa &skore. I adresa se do parametru zkopíruje, ale kopie adresy vede pořád do stejné přihrádky. Je to jako dát někomu svou adresu na papírku: i podle kopie papírku najde stejný dům.
V jazyce C funkce takto obvykle mění proměnné toho, kdo ji volá. Výhodou je, že už podle volání poznáte, že funkce může skore změnit: vidíte tam &. Parametr bonus zůstal obyčejný int, protože ho funkce jen čte.
Časté chyby:
- Volání bez
&, tedypridej_bonus(skore, 5);, skončí chybouincompatible integer to pointer conversion passing 'int' to parameter of type 'int *'; take the address with &. Překladač vám radí, co udělat: vzít adresu pomocí&. - Když uvnitř funkce zapomenete hvězdičku a napíšete
body += bonus;, program se přeloží bez chyby, ale změní kopii adresy, tedy samotný ukazatel, a ne skóre. Proměnnáskorezůstane 10. Když funkce „nic nedělá“, zkontrolujte nejdřív hvězdičky.
Jak psát:
Pokyny
Funkce pridej_mince má přidat mince, ale program vypíše Mince: 80, životy: 3, protože funkce mění jen svou kopii. Upravte ji tak, aby měnila proměnnou mince v main: z prvního parametru udělejte ukazatel int *mince, uvnitř funkce doplňte hvězdičku a při volání předejte adresu &mince. Program pak vypíše Mince: 130, životy: 3.
Ve hře stojí jeden život 100 mincí. Pod funkci pridej_mince napište funkci kup_zivot se dvěma parametry typu int *: mince a zivoty. Funkce přes ukazatele odečte 100 mincí a přičte jeden život. Na konci main (před return 0;) ji zavolejte s adresami obou proměnných a pak znovu stejně vypište řádek s mincemi a životy. Program vypíše Mince: 130, životy: 3 a pod tím Mince: 30, životy: 4.
Život jde koupit, jen když má hráč aspoň 100 mincí. Přidejte do funkce kup_zivot podmínku: když má hráč méně než 100 mincí, funkce nic nezmění a vypíše Málo mincí. Pak zavolejte kup_zivot ještě jednou a znovu vypište řádek s mincemi a životy. Poslední tři řádky výpisu budou Mince: 30, životy: 4, Málo mincí a Mince: 30, životy: 4.
Začněte programovat zdarma
5/11