C 語(yǔ)言中函數(shù)的參數(shù)傳入類(lèi)型
每個(gè)函數(shù)如果獨(dú)立的存在是沒(méi)有意義的。所以函數(shù)之間必然是相互通信的。而最常見(jiàn)也最常用的函數(shù)通信的方式就是函數(shù)的參數(shù)與返回值。而函數(shù)的參數(shù)是更為重要一些。因?yàn)榧兇鉀](méi)有參數(shù)傳入的函數(shù)是很好的。因?yàn)橐獙?shí)現(xiàn)某種功能,處理某些數(shù)據(jù),就要從外界獲得數(shù)據(jù)。
1. 值傳入
值傳入是在函數(shù)調(diào)用過(guò)程中,將原函數(shù)的數(shù)值復(fù)制一份后,將副本再傳入調(diào)用的函數(shù)中。在函數(shù)中操作的都是副本的數(shù)值。對(duì)原有函數(shù)中的原變量是沒(méi)有影響的。
2. 引用傳入
引用傳入是在函數(shù)調(diào)用的過(guò)程中,將原有函數(shù)中的變量直接傳入被調(diào)用的函數(shù)中。這時(shí)在被調(diào)用函數(shù)中操作的變量是調(diào)用函數(shù)的原有變量。這時(shí)原有變量中的數(shù)值會(huì)跟著函數(shù)的調(diào)用中的操作而改變數(shù)值。
而引用傳入有兩種方式:
- 使用數(shù)組
- 使用 & 符號(hào)
2.1 使用數(shù)組
對(duì)于 C 語(yǔ)言來(lái)說(shuō),由于考慮到效率的問(wèn)題的。數(shù)組的傳遞一般都是不復(fù)制的。因此函數(shù)中如果傳入的是數(shù)組,那么在被調(diào)用的函數(shù)中其實(shí)就是傳入了原始函數(shù)中的數(shù)組,而不是一個(gè)副本。
2.1 使用指針
使用指針是為了告訴 C 語(yǔ)言,我們這時(shí)希望將原有的變量直接傳入被調(diào)用的函數(shù),而不是一個(gè)副本。這種傳入方式在其它的編譯類(lèi)型的編程語(yǔ)言中也有類(lèi)似的傳遞方式。
3. 示例
3.1 值傳入示例
#include <stdio.h>
int add(int x)
{
x++;
printf("sub function\n x: %d\n", x);
return 0;
}
int main()
{
int a = 1;
add(a);
printf("mian function\n a: %d\n", a);
return 0;
}
運(yùn)行結(jié)果:
sub function
x: 2
mian function
a: 1
這段程序中,我們?cè)谥鞒绦蛑新暶鞑①x值了一個(gè)變量 a, 接著,我們調(diào)用了一個(gè)函數(shù)。在這個(gè)函數(shù)中,我們對(duì)于傳遞進(jìn)來(lái)的變量 x 進(jìn)行了自加操作。然后向屏幕打印此時(shí)的變量值。在這個(gè)被調(diào)用的函數(shù)執(zhí)行完畢后,我們返回到了主函數(shù)中。然后再次輸出此時(shí)的變量數(shù)值。發(fā)現(xiàn)是沒(méi)有變化的。
3.2 引用傳入示例
使用數(shù)組示例
#include <stdio.h>
int add(int x[])
{
x[0]++;
printf("sub function\n x: %d\n", x[0]);
return 0;
}
int main()
{
int a[] = {1};
add(a);
printf("mian function\n a: %d\n", a[0]);
return 0;
}
運(yùn)行結(jié)果:
sub function
x: 2
mian function
a: 2
這個(gè)示例程序中,我們采用了數(shù)組傳值的方式。其實(shí)這里只使用了一個(gè)只有一個(gè)數(shù)值的數(shù)組。其實(shí)和使用一個(gè)整數(shù)作為變量的效果是一樣的。我們首先初始化了一個(gè)數(shù)組,里面有一個(gè)數(shù)值 1 ,然后我們通過(guò)數(shù)組傳值到另外一個(gè)函數(shù)中。此時(shí)我們對(duì)這個(gè)數(shù)組中的數(shù)值進(jìn)行自加操作,然后顯式此時(shí)的數(shù)值。在這些操作結(jié)束后。程序返回到主函數(shù)中。然后顯式此時(shí)主函數(shù)中的數(shù)值。發(fā)現(xiàn)已經(jīng)同步發(fā)生了變化。
使用指針
#include <stdio.h>
int add(int *x)
{
(*x)++;
printf("sub function\n x: %d\n", *x);
return 0;
}
int main()
{
int a = 1;
add(&a);
printf("mian function\n a: %d\n", a);
return 0;
}
運(yùn)行結(jié)果:
sub function
x: 2
mian function
a: 2
在這個(gè)示例程序中,我們使用了指針進(jìn)行傳值,這樣的話,被調(diào)用的函數(shù)傳遞進(jìn)去的和調(diào)用它的函數(shù)中的值是同一個(gè)值。這就是我們?cè)诒徽{(diào)用函數(shù)中進(jìn)行了自加操作后。原來(lái)函數(shù)的值也發(fā)生了變化。這個(gè)示例可以和之前的值傳遞的示例對(duì)照看。這兩個(gè)示例的步驟完全一致,只是傳值的方式不同,所以造成了不同的結(jié)果。
4. 小結(jié)
對(duì)于函數(shù)的參數(shù)的值的傳遞問(wèn)題,是程序中最容易出問(wèn)題的地方。有些時(shí)候我們希望在被調(diào)用程序中的數(shù)值變化可以直接影響到調(diào)用這個(gè)程序的程序的數(shù)值的變化,有時(shí)候我們反而不希望被調(diào)用的函數(shù)中的修改影響到原有程序中的數(shù)值。
所以我們?cè)跀?shù)傳遞的過(guò)程中會(huì)有兩種形式,一種是變量的副本的傳遞,另外一種就是直接將值本身直接傳遞進(jìn)去。通過(guò)副本的傳遞,在被調(diào)用程序中的任何修改只是局限在被調(diào)用程序中。那么其本身不會(huì)受到影響。而直接傳遞本身進(jìn)入函數(shù)中的傳遞,則會(huì)同步修改兩邊的變量數(shù)值。