Studijní materiály
EXTRA Přihlásit Kontakt

Parametry funkcí v jazyce C

Parametry jsou hodnoty, které funkci předáme, aby měla s čím pracovat. V jazyce C se všechny parametry předávají hodnotou – funkce dostane vlastní kopii, takže změna uvnitř funkce se do původní proměnné nepromítne. Když je potřeba původní proměnnou opravdu změnit, předává se ukazatel na ni.

Předávání hodnotou

Funkce pracuje s kopií. Následující pokus o prohození dvou čísel proto nefunguje – prohodí se jen kopie uvnitř funkce a volající o tom nemá tušení.

void prohod_spatne(int a, int b) {
    int pomocna = a;
    a = b;
    b = pomocna;
}

int x = 1, y = 2;
prohod_spatne(x, y);
printf("%d %d\n", x, y);   // pořád 1 2

Předávání ukazatelem

Když funkci předáme adresu proměnné (operátorem &), může se přes ni k původní proměnné dostat a změnit ji. Uvnitř funkce se k hodnotě přistupuje dereferencí (operátorem *).

void prohod(int *a, int *b) {
    int pomocna = *a;
    *a = *b;
    *b = pomocna;
}

int x = 1, y = 2;
prohod(&x, &y);
printf("%d %d\n", x, y);   // 2 1

Pole jako parametr

Pole se do funkce nikdy nekopíruje celé – předá se jen adresa jeho prvního prvku. Funkce proto sama nepozná, kolik má pole prvků, a délka se jí musí předat zvlášť jako další parametr.

int soucet(int pole[], int delka) {
    int celkem = 0;
    for (int i = 0; i < delka; i++) {
        celkem += pole[i];
    }
    return celkem;
}

int cisla[5] = {1, 2, 3, 4, 5};
printf("%d\n", soucet(cisla, 5));   // 15

Zápisy int pole[] a int *pole znamenají v hlavičce funkce naprosto totéž.

Parametry označené const

Když funkce má data jenom číst, vyplatí se parametr označit jako const. Překladač pak ohlídá, že se do něj omylem nezapíše, a čtenáři kódu je hned jasné, co funkce dělá.

int delka_retezce(const char *text) {
    int i = 0;
    while (text[i] != '\0') {
        i++;
    }
    return i;
}

Funkce bez parametrů

Funkce, která nic nedostává, se v hlavičce zapisuje s klíčovým slovem void. Prázdné závorky sice překladač vezme také, ale znamenají něco jiného – že počet parametrů není určený.

int nacti_cislo(void) {
    int cislo;
    scanf("%d", &cislo);
    return cislo;
}

Proměnný počet parametrů

Funkce může přijmout i předem neznámý počet argumentů – přesně tak funguje printf. Slouží k tomu tři tečky v hlavičce a makra z knihovny <stdarg.h>.

#include <stdarg.h>

int soucet_vice(int pocet, ...) {
    va_list args;
    va_start(args, pocet);

    int celkem = 0;
    for (int i = 0; i < pocet; i++) {
        celkem += va_arg(args, int);
    }

    va_end(args);
    return celkem;
}

printf("%d\n", soucet_vice(3, 10, 20, 30));   // 60