Naposledy aktualizováno 27. července 2020
Skutečné argumenty #
Argumenty, které jsou uvedeny ve volání funkce, se nazývají skutečné argumenty. Například:
func1(12, 23);
zde 12
a 23
jsou skutečné argumenty.
Aktuálními argumenty mohou být konstanty, proměnné, výrazy atd.
12 |
func1(a, b); // here actual arguments are variablefunc1(a + b, b + a); // here actual arguments are expression |
Formální argumenty #
Argumenty, které jsou uvedeny v definici funkce, se nazývají formální argumenty. Formální argumenty jsou velmi podobné lokálním proměnným uvnitř funkce. Stejně jako lokální proměnné jsou formální argumenty po ukončení funkce zničeny.
1234 |
int factorial(int n){ // write logic here} |
Tady n
je formální argument. Co je třeba si zapamatovat o skutečných a formálních argumentech:
- Pořadí, počet a typ skutečných argumentů ve volání funkce se musí shodovat s formálními argumenty funkce.
- Pokud dojde k typové neshodě mezi skutečnými a formálními argumenty, pak se překladač pokusí převést typ skutečných argumentů na formální argumenty, pokud je to legální, V opačném případě bude formálnímu argumentu předána odpadní hodnota.
- Změny provedené ve formálním argumentu nemají vliv na skutečné argumenty.
Následující program demonstruje toto chování.
1 2 3 4 5 6 7 8 910111213141516171819202122232425 |
#include<stdio.h>void func_1(int);int main(){ int x = 10; printf("Before function call\n"); printf("x = %d\n", x); func_1(x); printf("After function call\n"); printf("x = %d\n", x); // signal to operating system program ran fine return 0;}void func_1(int a){ a += 1; a++; printf("\na = %d\n\n", a);} |
Zde je hodnota proměnné x
před voláním funkce func_1()
10
, po volání func_1()
je hodnota x
uvnitř main()
stále 10
. Změny provedené uvnitř funkce func_1()
nemají na hodnotu x
vliv. K tomu dochází proto, že když předáváme hodnoty funkcím, vytvoří se kopie hodnoty a tato kopie se předá formálním argumentům. Formální argumenty tedy pracují s kopií původní hodnoty, nikoli s původní hodnotou samotnou, proto se změny provedené uvnitř func_1()
neprojeví uvnitř main()
. Tento proces je znám jako předávání argumentů pomocí volání podle hodnoty, podrobněji se tímto konceptem budeme zabývat v příštích kapitolách.
.