Ukazatele a pole
Ukazatele a pole mají v jazyce C k sobě velmi blízko. Název pole, když ho použijete samotný, je adresa jeho prvního prvku. Můžete ho proto uložit do ukazatele, a to bez &:
#include <stdio.h>
int main(void) {
int cisla[] = {3, 7, 1};
int *p = cisla;
printf("%d\n", *p);
printf("%d\n", p[1]);
return 0;
}Tento kód vypíše:
3
7int *p = cisla; znamená totéž co int *p = &cisla[0];, takže *p je první prvek. A s ukazatelem můžete používat hranaté závorky stejně jako s polem: p[1] je prvek hned za tím, na který p ukazuje, tady 7.
Prvky pole leží v paměti hned vedle sebe. p + 1 je adresa dalšího prvku a p[1] je jen kratší zápis pro *(p + 1). V tomto kurzu píšeme hranaté závorky, ale ten druhý zápis uvidíte v jiných programech v C.
Vzpomeňte si na chybu z lekce o polích: celé pole vypsané pomocí printf("%d\n", body); nejde přeložit a hláška říká the argument has type 'int *'. Teď už víte proč: název pole je adresa typu int *, a ne číslo pro značku %d.
Tím se vysvětluje i to, co znáte z lekce o funkcích. Když funkci předáte pole, jazyk C ho nekopíruje, ale předá jen adresu jeho prvního prvku. Parametr int cisla[] je ve skutečnosti ukazatel, takže ho můžete napsat i jako int *cisla. Obojí znamená přesně totéž:
#include <stdio.h>
void zdvojnasob_vse(int *cisla, int pocet) {
for (int i = 0; i < pocet; i++) {
cisla[i] *= 2;
}
}
int main(void) {
int ceny[] = {10, 25, 40};
zdvojnasob_vse(ceny, 3);
printf("%d %d %d\n", ceny[0], ceny[1], ceny[2]);
return 0;
}Tento kód vypíše:
20 50 80Přes adresu funkce pracuje s polem volajícího, a proto její změny zůstanou. A proto také funkce potřebuje počet prvků: dostane jen adresu prvního prvku a nepozná, kde pole končí. Uvnitř funkce nepomůže ani sizeof(cisla) / sizeof(cisla[0]). Tam je cisla ukazatel, takže sizeof vrátí velikost ukazatele a výsledek je špatně (tady vyjde 1). Celé pole vidí sizeof jen tam, kde pole vzniklo, třeba v main. Počet prvků proto funkci vždy předávejte jako parametr.
Jak psát:
Pokyny
Na konec main (před return 0;) vytvořte ukazatel p na první prvek pole body: int *p = body;.
Pod něj vypište přes ukazatel dva prvky: text První: a *p a na dalším řádku Druhý: a p[1]. Program vypíše První: 12 a Druhý: 7.
Změňte parametr funkce vypis_vse z int cisla[] na int *cisla. Výpis se nezmění, protože oba zápisy znamenají totéž.
Pod funkci vypis_vse napište funkci pricti_ke_vsem s parametry int *cisla, int pocet a int kolik, která ke každému prvku přičte kolik. Na konci main ji zavolejte s body, 4 a 5 a pak ještě jednou zavolejte vypis_vse(body, 4). Poslední řádek výpisu bude 17 12 20 14.
Začněte programovat zdarma
8/11