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.
Jak psát:
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
10/11