Ukazatel jen pro čtení

S ukazatelem jako parametrem může funkce měnit proměnné volajícího. To se hodí, ale je to i riziko: funkce, která má pole jen číst, by ho mohla omylem změnit. A kdo čte první řádek int soucet(int *cisla, int pocet), nepozná, jestli funkce pole mění, nebo ne.

Oba problémy řeší klíčové slovo const. Znáte ho z konstant jako const double DPH = 0.21;: hodnota, která se nesmí změnit. Před typem ukazatele znamená, že se hodnoty přes tento ukazatel měnit nesmějí:

int soucet(const int *cisla, int pocet) {
    int celkem = 0;
    for (int i = 0; i < pocet; i++) {
        celkem += cisla[i];
    }
    return celkem;
}

const int *cisla čtěte jako „cisla ukazuje na celá čísla, která funkce smí jen číst“. Pole, které funkci předáte, const být nemusí: slib platí jen uvnitř funkce. Když se ho funkce přesto pokusí změnit, třeba příkazem cisla[0] = 0;, překlad skončí chybou read-only variable is not assignable (proměnnou jen pro čtení nejde měnit). Proto pište const vždy, když funkce pole jen čte. Její první řádek to pak říká a překladač to hlídá.

Tento zápis už znáte: parametr const char text[] z lekce o funkcích je totéž co const char *text.

U řetězců má const ještě jedno použití. Ukazatel může ukazovat i na text v uvozovkách:

#include <stdio.h>

int main(void) {
    char slovo[] = "pes";
    slovo[0] = 'l';
    printf("%s\n", slovo);

    const char *zvire = "kočka";
    printf("%s\n", zvire);
    zvire = "myš";
    printf("%s\n", zvire);
    return 0;
}

Tento kód vypíše:

les
kočka
myš

char slovo[] = "pes"; vytvoří pole a text do něj zkopíruje. Pole je vaše, takže jeho písmena můžete měnit. const char *zvire = "kočka"; žádné vlastní pole nevytvoří: ukazatel jen ukazuje na text v uvozovkách a ten leží v části paměti, kterou program nesmí měnit. Proto před něj patří const. Pak je zvire[0] = 'K'; chyba při překladu (read-only variable is not assignable), ale na jiný text ukazatel přesměrovat můžete: zvire = "myš";. Jazyk C dovolí napsat i char *zvire = "kočka"; bez const, ale měnit text přes takový ukazatel je chyba: na počítači program obvykle spadne.

Pokyny

Funkce pocet_uspesnych pole jen čte. Změňte její parametr na const int *body. Program dál vypisuje Prošlo: 3.

Funkce vypis_nadpis text jen čte a text v uvozovkách se stejně měnit nesmí. Změňte její parametr na const char *nadpis.

Pod funkci pocet_uspesnych napište funkci nejlepsi, která dostane body jako const int *body a jejich počet a vrátí nejvyšší počet bodů. V main pod poslední printf vypište Nejlepší: a výsledek nejlepsi(body, 5). Program vypíše Nejlepší: 90.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

10/11