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: 10

Funkce 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: 18

Změ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 &, tedy pridej_bonus(skore, 5);, skončí chybou incompatible 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á skore zůstane 10. Když funkce „nic nedělá“, zkontrolujte nejdřív hvězdičky.

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

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

Nebo se registrujte pomocí:

5/11