GNU/Linux >> Znalost Linux >  >> Linux

Výukový program programování Linux C, část 8 – Volání podle hodnoty versus volání podle ukazatele/adresy

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.


Linux
  1. C Výukový program programování Část 3 - Základy proměnných

  2. C Výukový program programování Část 5 - Znakové proměnné

  3. Výukový program programování v Linuxu C Část 10 - Variabilní rozsahy

  1. Výukový program programování v Linuxu C Část 9:Řetězce

  2. Výukový program programování Linux C, část 8 – Volání podle hodnoty versus volání podle ukazatele/adresy

  3. Výukový program programování Linux C, část 8 – Volání podle hodnoty versus volání podle ukazatele/adresy

  1. Linux C výukový program programování část 14 - praktické příklady bitových operátorů

  2. Výukový program programování v Linuxu C Část 12 – Operátory přiřazení a podmíněné výrazy

  3. Linux C výuka programování, část 11 - Aritmetické, relační a logické operátory