V první části této série výukových programů jsme krátce diskutovali o funkcích, včetně jejich deklarace a těla. To, co jsme v té době neprobírali, bylo několik způsobů volání funkcí. Zde v tomto tutoriálu rychle probereme způsoby, které existují.
V jazyce C můžete funkci volat několika způsoby:voláním podle hodnoty a voláním pomocí ukazatele nebo adresy. Pojďme si oba tyto koncepty probrat na několika snadno srozumitelných příkladech.
Řekněme, že chcete napsat program, který zamění dvě hodnoty. Můžete to udělat takto:
#include <stdio.h>
int main()
{
int a=0, b=0, c=0;
printf("Enter two integer values\n");
scanf("%d %d",&a,&b);
printf("Entered values are: %d and %d", a,b);
c = a;
a = b;
b = c;
printf("\nSwapped values are: %d and %d", a,b);
return 0;
}
Zde je výstup tohoto kódu se zadanými hodnotami jako 5 a 9:
Enter two integer values
5 9
Entered values are: 5 and 9
Swapped values are: 9 and 5
Nyní předpokládejme, že požadavkem je mít samostatnou funkci - řekněme 'swap' - která provádí veškerou práci související s výměnou a lze ji zavolat, kdykoli chce programátor prohodit dvě hodnoty. Následuje kód, který to dělá:
#include <stdio.h>
void swap (int val1, int val2)
{
int temp = 0;
temp = val1;
val1 = val2;
val2 = temp;
printf("\nSwapped values are: %d and %d", val1,val2);
}
int main()
{
int a=0, b=0;
printf("Enter two integer values\n");
scanf("%d %d",&a,&b);
printf("Entered values are: %d and %d", a,b);
swap(a,b);
return 0;
}
Takže tady to je. Byla vytvořena samostatná funkce s názvem 'swap', která přijímá dvě hodnoty (původně zadané uživatelem a zachycené ve funkci 'main') jako argumenty a poté je zamění a vytiskne výstup.
Způsob, jakým se zde nazývá „swap“, je známý jako „volání podle hodnoty“. Důvodem je, že když je volání provedeno, pouze hodnoty držené 'a' a 'b' jsou předány funkci 'swap' jako argumenty. Tyto hodnoty jsou přijímány argumenty 'val1' a 'val2' a jsou to právě tyto proměnné, na kterých se provádí swapovací proces.
To znamená, že proměnné 'a' a 'b' ve funkci 'main' si nadále zachovávají původní hodnoty i po provedení operace swap. Ale co když je požadavkem mít hodnoty 'a' a 'b' prohozené po volání funkce 'swap'? Zde přichází na řadu metoda 'volání ukazatelem/adresou'.
Takže v podstatě to, co zde děláme, je, že předáme adresy proměnných (jako 'a' a 'b' v našem případě) jako argumenty. Funkce, která se nazývá (v tomto případě 'swap'), je vybavena tak, aby přijímala adresy jako argumenty a pak se proces swapování provádí na hodnotách uložených na těchto adresách, což v podstatě znamená hodnoty původních proměnných (zde 'a' a 'b' ) nechat se vyměnit.
Nyní, v předchozím odstavci, jsme řekli, že funkce „je vybavena k přijímání adres jako argumentů“. No, "vybaveno" jsme mysleli, že má speciální typ argumentů, které mohou přijímat adresy. Tyto argumenty jsou proměnné typu „ukazatel“. „Ukazatele“ podrobně probereme v nadcházejícím tutoriálu, ale prozatím mějte na paměti, že proměnné ukazatele ukládají adresy paměti jako hodnoty.
Zde je návod, jak je deklarován/definován ukazatel na celé číslo:
int *x;
Takže v podstatě x je ukazatelová proměnná, kterou lze použít k uložení adresy paměti celočíselné proměnné. Předpokládejme, že 'i' je celočíselná proměnná, pak můžete takto zajistit, aby 'x' ukládalo adresu 'i':
x = &i;
A kdykoli budete chtít získat přístup k hodnotě 'i' až 'x', napíšete '*x'. Zde je například návod, jak můžete změnit hodnotu „i“ na, řekněme, 10:
*x = 10;
Takže s ohledem na to vše můžete takto zavolat „swap“ pomocí metody volání podle adresy nebo ukazatele:
#include <stdio.h>
void swap (int *val1, int *val2)
{
int temp = 0;
temp = *val1;
*val1 = *val2;
*val2 = temp;
}
int main()
{
int a=0, b=0, c=0;
printf("Enter two integer values\n");
scanf("%d %d",&a,&b);
printf("Entered values are: %d and %d", a,b);
swap(&a,&b);
printf("\nSwapped values are: %d and %d", a,b);
return 0;
}
Tentokrát jsme tedy místo předávání hodnot 'a' a 'b' jako argumentů předali adresy těchto proměnných. Ve funkci 'swap' jsou adresy přijímány ve dvou ukazatelových proměnných ('val1' a 'val2'). A pomocí dvou proměnných ukazatele logika přímo vymění hodnoty 'a' a 'b'.
Zde je výstup:
Enter two integer values
6 8
Entered values are: 6 and 8
Swapped values are: 8 and 6
Tento článek by vám měl poskytnout alespoň základní představu o tom, co jsou způsoby volání funkcí „volání podle hodnoty“ a „volání podle adresy/ukazatele“ a kdy je lze použít. Vyzkoušejte příklady, které jsme zde uvedli, a dejte nám vědět v komentářích níže, pokud máte nějaké pochybnosti nebo dotazy.