Shrnutí

V této lekci jste se naučili, že:

  • Každá proměnná je uložená v paměti a má adresu. &x je adresa proměnné x a %p ji vypíše.
  • Ukazatel je proměnná, ve které je uložená adresa: int *p = &x;. Jeho typ říká, na co ukazuje: int *, double *, char *.
  • *p je hodnota, na kterou p ukazuje (dereference). Můžete ji číst, printf("%d\n", *p);, i měnit, *p = 20;. Bez hvězdičky p = &y; změní, kam ukazatel ukazuje.
  • V deklaraci * vytváří ukazatel. Před ukazatelem získá hodnotu z adresy. Mezi dvěma hodnotami násobí. & a * jsou protiklady.
  • Funkce s parametrem typu ukazatel může změnit proměnnou volajícího: void pridej_bonus(int *body, int bonus) zavoláte jako pridej_bonus(&skore, 5). Zapomenutý & ve volání ohlásí překladač jako chybu, zapomenutou hvězdičku uvnitř funkce ale neohlásí nic.
  • Přes ukazatele může funkce prohodit dvě proměnné nebo předat víc výsledků najednou (výstupní parametry).
  • Název pole je adresa jeho prvního prvku, takže funguje int *p = cisla; i p[1]. Parametr int cisla[] je ukazatel, totéž co int *cisla. Proto funkce mění pole volajícího a potřebuje znát počet jeho prvků.
  • NULL je ukazatel, který nikam neukazuje. Funkce, která vrací ukazatel, třeba adresu nalezeného prvku, vrátí NULL, když žádný takový prvek není. Ukazatel, který může být NULL, před použitím zkontrolujte: if (p != NULL). Čtení přes NULL tady zastaví program chybou RuntimeError: unreachable.
  • const int *cisla je ukazatel, přes který funkce jen čte. Na text v uvozovkách ukazuje ukazatel const char *: const char *jmeno = "Anna";.

V další lekci, o strukturách, se naučíte seskupit hodnoty, které k sobě patří, třeba jméno žáka a jeho body, do jedné proměnné. Ukazatele se vám budou hodit i tam.

Pokyny

Teď si vše procvičte. V poli body jsou výsledky testu a učitel ke každému přidá bonus. Nad main napište funkci pridej_bonus s parametry int *body, int pocet a int bonus. Funkce přičte bonus ke každému výsledku, ale žádný výsledek nesmí přesáhnout 100 bodů: co by bylo víc, nastaví na 100. Před cyklem ji zavolejte s bonusem 10. Program vypíše pod sebou 55, 82, 100, 48 a 76.

Pod funkci pridej_bonus napište funkci najdi_min_max s parametry const int *body, int pocet, int *nejmensi a int *nejvetsi. Přes oba ukazatele uloží nejmenší a největší výsledek, takže „vrátí“ dva výsledky najednou. Na začátku do obou uložte první prvek pole. Na konci main vytvořte dvě proměnné, předejte funkci jejich adresy a vypište je: Nejméně: 48, nejvíc: 100.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

11/11