1、在C語言中,所有非數組形式的資料實參都是以值傳遞的形式調用,在值傳遞的過程中,被調用函數的形式參數被視為該函數的局部變數,即在記憶體的堆棧中開闢空間以存放由主調函數放進來的實參的值,從而成為了實參的一個拷貝。所以被調用函數不能修改作為實參的實際變數的值,而只能修改傳遞給他的那份備份。
2、而在地址傳遞過程中,被調函數的形參雖然也作為局部變數在堆棧中開闢了記憶體空間,但是這時存放的是由主調函數放進來的實參變數的地址,被調函數對形參的任何操作都被處理成間接定址,即通過堆棧中存放的地址訪問主調函數中的實參變數。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變數。
3、同時,還有一個問題值得大家注意:無法向函數傳遞一個數組
可以驗證一下:
void fun(char a[10]){int i = sizeof(a);char c = a[3];}
如果數組真的傳遞到函數內部,那麼i的值應該是10,可惜,i的值為4,的確沒有傳遞過去。
C語言中,當一維數組作為函數的參數時,編譯器總是把它解析成一個指向其首元素地址的指標。
針對上面的值傳遞與地址傳遞,下面用代碼說明問題:
/* * main.c * * Created on: Apr 28, 2012 * Author: root */#include <stdio.h>void swap_val(int x, int y){int temp;temp = x;x = y;y = temp;printf("x = %d, y = %d\n", x, y);}void swap_addr(int *x, int *y){int temp;temp = *x;*x = *y;*y = temp;}int main(void){int a, b;printf("please input two integer\n");scanf("%d %d", &a,&b);if (a < b) {swap_val(a, b);printf("a = %d, b = %d\n", a, b);swap_addr(&a, &b);printf("a = %d, b = %d\n", a, b);}return 0;}
驗證結果如下:
please input two integer
1
2
x = 2, y = 1
a = 1, b = 2
a = 2, b = 1