C 語言中函數的參數傳入類型
每個函數如果獨立的存在是沒有意義的。所以函數之間必然是相互通信的。而最常見也最常用的函數通信的方式就是函數的參數與返回值。而函數的參數是更為重要一些。因為純粹沒有參數傳入的函數是很好的。因為要實現某種功能,處理某些數據,就要從外界獲得數據。
1. 值傳入
值傳入是在函數調用過程中,將原函數的數值復制一份后,將副本再傳入調用的函數中。在函數中操作的都是副本的數值。對原有函數中的原變量是沒有影響的。
2. 引用傳入
引用傳入是在函數調用的過程中,將原有函數中的變量直接傳入被調用的函數中。這時在被調用函數中操作的變量是調用函數的原有變量。這時原有變量中的數值會跟著函數的調用中的操作而改變數值。
而引用傳入有兩種方式:
- 使用數組
- 使用 & 符號
2.1 使用數組
對于 C 語言來說,由于考慮到效率的問題的。數組的傳遞一般都是不復制的。因此函數中如果傳入的是數組,那么在被調用的函數中其實就是傳入了原始函數中的數組,而不是一個副本。
2.1 使用指針
使用指針是為了告訴 C 語言,我們這時希望將原有的變量直接傳入被調用的函數,而不是一個副本。這種傳入方式在其它的編譯類型的編程語言中也有類似的傳遞方式。
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;
}
運行結果:
sub function
x: 2
mian function
a: 1
這段程序中,我們在主程序中聲明并賦值了一個變量 a, 接著,我們調用了一個函數。在這個函數中,我們對于傳遞進來的變量 x 進行了自加操作。然后向屏幕打印此時的變量值。在這個被調用的函數執行完畢后,我們返回到了主函數中。然后再次輸出此時的變量數值。發現是沒有變化的。
3.2 引用傳入示例
使用數組示例
#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;
}
運行結果:
sub function
x: 2
mian function
a: 2
這個示例程序中,我們采用了數組傳值的方式。其實這里只使用了一個只有一個數值的數組。其實和使用一個整數作為變量的效果是一樣的。我們首先初始化了一個數組,里面有一個數值 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;
}
運行結果:
sub function
x: 2
mian function
a: 2
在這個示例程序中,我們使用了指針進行傳值,這樣的話,被調用的函數傳遞進去的和調用它的函數中的值是同一個值。這就是我們在被調用函數中進行了自加操作后。原來函數的值也發生了變化。這個示例可以和之前的值傳遞的示例對照看。這兩個示例的步驟完全一致,只是傳值的方式不同,所以造成了不同的結果。
4. 小結
對于函數的參數的值的傳遞問題,是程序中最容易出問題的地方。有些時候我們希望在被調用程序中的數值變化可以直接影響到調用這個程序的程序的數值的變化,有時候我們反而不希望被調用的函數中的修改影響到原有程序中的數值。
所以我們在數傳遞的過程中會有兩種形式,一種是變量的副本的傳遞,另外一種就是直接將值本身直接傳遞進去。通過副本的傳遞,在被調用程序中的任何修改只是局限在被調用程序中。那么其本身不會受到影響。而直接傳遞本身進入函數中的傳遞,則會同步修改兩邊的變量數值。