C語言值傳遞函式呼叫



在C語言中,一個函式可以從任何其他函式(包括自身)呼叫。函式呼叫有兩種方式:(a)值傳遞和(b)引用傳遞。預設情況下,使用值傳遞機制。

形式引數和實際引數

您必須瞭解這些術語才能理解值傳遞方法的工作原理:

形式引數 - 函式需要某些資料來執行其所需的過程。定義函式時,假設資料值將以引數或引數列表的形式提供,該列表位於函式名前面的括號內。這些引數是某種資料型別的變數。

實際引數 - 當要呼叫某個函式時,應為其提供相同型別且順序相同的所需數量的值,就像在其定義中使用的那樣。

看看下面的程式碼片段:

type function_name(type var1, type var2, ...)

這裡,引數變數稱為形式引數。在函式的作用域內,這些變數充當其區域性變數

考慮以下函式:

int add(int x, int y){

   int z = x + y;

   return z;

}

此函式定義中的引數xy是形式引數。

示例:C語言中的值傳遞

如果呼叫add()函式,如下面的程式碼所示,則括號內的變數(ab)是實際引數。它們被傳遞給函式。

請看下面的例子:

#include <stdio.h>

int add(int x, int y){

   int z = x + y;

   return z;
}

int main(){

   int a = 10, b = 20;
   
   int c = add(a, b);

   printf("Addition: %d", c);
}

輸出

執行此程式碼後,將產生以下輸出:

Addition: 30

值傳遞方法意味著實際引數的值被複制到形式引數變數中。因此,“x”取“a”的值,“b”賦值給“y”。add()函式中的區域性變數“z”儲存加法值。在main()函式中,add()函式返回的值被賦值給“c”,然後打印出來。

請注意,C語言中的變數是記憶體中的命名位置。因此,變數在記憶體中建立,並且每個變數由編譯器分配一個隨機記憶體地址。

C語言中的“值傳遞”是如何工作的?

讓我們假設main()函式中的變數abc分別佔據記憶體位置100、200和300。當用ab作為實際引數呼叫add()函式時,它們的值分別儲存在xy中。

Random Memory Address

變數xyz是add()函式的區域性變數。在記憶體中,它們將被分配一些隨機位置。讓我們假設它們分別在記憶體地址1000、2000和3000中建立。

由於函式是透過將實際引數的值複製到其對應的形式引數變數來呼叫的,因此xy的地址(分別是1000和2000)將分別儲存10和20。編譯器將其和分配給第三個區域性變數z,然後返回。

當控制返回到main()函式時,返回的資料被賦值給c,並顯示為程式的輸出。

示例

值傳遞是C語言中預設的函式呼叫機制。它消除了函式的潛在副作用,使您的軟體更易於維護和理解。它最適合於預期對接收到的引數進行特定計算並返回結果的函式。

這是另一個值傳遞的例子:

#include <stdio.h>

/* function declaration */
void swap(int x, int y);

int main(){

   /* local variable definition */
   int a = 100;
   int b = 200;

   printf("Before swap, value of a: %d\n", a);
   printf("Before swap, value of b: %d\n", b);

   /* calling a function to swap the values */
   swap(a, b);

   printf("After swap, value of a: %d\n", a);
   printf("After swap, value of b: %d\n", b);

   return 0;
}

void swap(int x, int y){

   int temp;

   temp = x; /* save the value of x */
   x = y;    /* put y into x */
   y = temp; /* put temp into y */

   return;
}

輸出

執行此程式碼後,將產生以下輸出:

Before swap, value of a: 100
Before swap, value of b: 200
After swap, value of a: 100
After swap, value of b: 200

它表明值沒有改變,儘管它們在函式內部發生了改變。

由於值被複制到另一個函式的不同區域性變數中,任何操作都不會影響呼叫函式中的實際引數變數。

但是,當我們需要將大型物件(如陣列或檔案)傳遞給另一個函式時,值傳遞方法效率較低。此外,在某些情況下,我們可能需要另一個函式來操作實際引數。在這種情況下,值傳遞機制不起作用。我們必須為此目的探索引用傳遞機制。請參考下一章,瞭解C語言引用傳遞機制的詳細解釋。

引用傳遞方法涉及傳遞儲存實際引數值的變數的地址。您可以設計一種呼叫方法,該方法是值傳遞和引用傳遞的混合。在這種情況下,某些引數按值傳遞,而其他引數按引用傳遞。

廣告