、
將參數(shù)值或數(shù)據(jù)傳遞給C語言函數(shù)有兩種方法:通過值調(diào)用和通過引用調(diào)用。原始值在通過值調(diào)用時不修改,但通過引用調(diào)用時,在函數(shù)中可進(jìn)行修改。

下面將分別講解如何通過值調(diào)用和通過引用調(diào)用,并用使用示例逐個調(diào)用演示執(zhí)行。
在通過值調(diào)用函數(shù)時,原始值不被修改。
在通過值調(diào)用時,傳遞給函數(shù)的值由函數(shù)參數(shù)在堆棧內(nèi)存位置中本地存儲。如果更改函數(shù)參數(shù)的值,則僅對當(dāng)前調(diào)用函數(shù)中的值進(jìn)行臨時更改。它不會改變調(diào)用者方法(如:main())中的變量的值。即:函數(shù)只是使用參數(shù)值的一個副本,函數(shù)執(zhí)行完成副本刪除,而原始值不會有任何影響。
我們試著通過下面的例子來了解C語言中的通過值調(diào)用的概念,首先創(chuàng)建一個工程:function-call-by-value-reference,并在這個工程下創(chuàng)建一個源文件: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;
// 更新之前參數(shù)x的值
printf("Before function call x=%d \n", x);
change(x); // passing value in function
// 更新之后參數(shù)x的值
printf("After function call x=%d \n", x);
return 0;
}
執(zhí)行上面示例代碼,得到以下結(jié)果 -
Before function call x=10
Before adding value inside function num=10
After adding value inside function num=20
After function call x=10
在通過引用的調(diào)用中,原始值可被修改并反映到外部調(diào)用者。
這里,使用值的地址傳遞到函數(shù)中,所以實際和形式的參數(shù)共享相同的地址空間。 因此,函數(shù)內(nèi)部的值被改變,都會反映在函數(shù)內(nèi)部和外部,因為函數(shù)內(nèi)部和外部此時都指向參數(shù)的地址空間。
注意:要了解通過引用調(diào)用,您必須具有指針的基本知識。
讓我們通過下面的例子來嘗試?yán)斫釩語言中通過引用調(diào)用的概念,創(chuàng)建一個源文件:call-by-reference.c,其代碼如下所示-
#include <stdio.h>
// 定義函數(shù),注意這里的參數(shù)名稱前加了一個星號(*)
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);
// 注意,下面?zhèn)鬟f的參數(shù)名稱前加了一個符號(&)
change2(&x);// passing reference in function
printf("After function call x=%d \n", x);
return 0;
}
執(zhí)行上面示例代碼,得到以下結(jié)果 -
Before function call x=200
Before adding value inside function num=200
After adding value inside function num=300
After function call x=300
| 通過值調(diào)用 | 通過引用調(diào)用 |
|---|---|
| 將值的副本傳遞給函數(shù) | 將值的地址傳遞給函數(shù) |
| 函數(shù)內(nèi)的更改不會反映在函數(shù)外 | 函數(shù)內(nèi)部的改變也反映在函數(shù)的外部 |
| 將在不同的內(nèi)存位置創(chuàng)建實際和正式的參數(shù) | 將在相同的內(nèi)存位置創(chuàng)建實際和正式的參數(shù) |