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.
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
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 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éž.
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, 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;
}
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