、
將引數值或資料傳遞給C語言函式有兩種方法:通過值呼叫和通過參照呼叫。原始值在通過值呼叫時不修改,但通過參照呼叫時,在函式中可進行修改。
下面將分別講解如何通過值呼叫和通過參照呼叫,並用使用範例逐個呼叫演示執行。
在通過值呼叫函式時,原始值不被修改。
在通過值呼叫時,傳遞給函式的值由函式引數在堆疊記憶體位置中本地儲存。如果更改函式引數的值,則僅對當前呼叫函式中的值進行臨時更改。它不會改變呼叫者方法(如:main()
)中的變數的值。即:函式只是使用引數值的一個副本,函式執行完成副本刪除,而原始值不會有任何影響。
我們試著通過下面的例子來了解C語言中的通過值呼叫的概念,首先建立一個工程:function-call-by-value-reference,並在這個工程下建立一個原始檔:call-by-value.c,其程式碼如下所示-
#include <stdio.h>
void change(int num) {
printf("Before adding value inside function num=%d \n", num);
num = num + 10;
printf("After adding value inside function num=%d \n", num);
}
int main() {
int x = 10;
// 更新之前引數x的值
printf("Before function call x=%d \n", x);
change(x); // passing value in function
// 更新之後引數x的值
printf("After function call x=%d \n", x);
return 0;
}
執行上面範例程式碼,得到以下結果 -
Before function call x=10
Before adding value inside function num=10
After adding value inside function num=20
After function call x=10
在通過參照的呼叫中,原始值可被修改並反映到外部呼叫者。
這裡,使用值的地址傳遞到函式中,所以實際和形式的引數共用相同的地址空間。 因此,函式內部的值被改變,都會反映在函式內部和外部,因為函式內部和外部此時都指向引數的地址空間。
注意:要了解通過參照呼叫,您必須具有指標的基本知識。
讓我們通過下面的例子來嘗試理解C語言中通過參照呼叫的概念,建立一個原始檔:call-by-reference.c,其程式碼如下所示-
#include <stdio.h>
// 定義函式,注意這裡的引數名稱前加了一個星號(*)
void change2(int *num) {
printf("Before adding value inside function num=%d \n", *num);
(*num) += 100;
printf("After adding value inside function num=%d \n", *num);
}
int main() {
int x = 200;
printf("Before function call x=%d \n", x);
// 注意,下面傳遞的引數名稱前加了一個符號(&)
change2(&x);// passing reference in function
printf("After function call x=%d \n", x);
return 0;
}
執行上面範例程式碼,得到以下結果 -
Before function call x=200
Before adding value inside function num=200
After adding value inside function num=300
After function call x=300
通過值呼叫 | 通過參照呼叫 |
---|---|
將值的副本傳遞給函式 | 將值的地址傳遞給函式 |
函式內的更改不會反映在函式外 | 函式內部的改變也反映在函式的外部 |
將在不同的記憶體位置建立實際和正式的引數 | 將在相同的記憶體位置建立實際和正式的引數 |