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
7

int *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 80

Př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.

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

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

Nebo se registrujte pomocí:

8/11