C語言函數傳遞方式
值傳遞
定義
- 所謂的值傳遞,顧名思義就是使用變量、常量、數組等作爲函數的參數。實際是將實參的值複製到形參相應的存儲單元中,即形參和實參分別佔用不同的存儲單元。
特點
- 值傳遞的特點是單向傳遞,即主調函數被調用時給形參分配存儲單元,把實參的值傳遞給形參,在調用結束後,形參的存儲單元被釋放,而形參值的任何變化都不會影響到實參的值,實參的存儲單元仍保留並維持數值不變。
示意圖
其實值傳遞過程中由隱含的一步,如下代碼所示:
int x = a;
int y = b;
所以swap1函數交換的是x和y,而原來的a和b從未改變。
代碼演示
void swap1(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
printf("x = %d,y = %d\n",x,y);
}
int main(int argc, char *argv[])
{
int a = 12,b = 24;
swap1(a,b); // 值傳遞
printf("a = %d b = %d",a,b);
}
運行結果
地址傳遞
說明
- 大家都知道,在C語言中,數組名就代表數組的首地址。所謂的地址傳遞,指的就是函數的參數是數組名或者指針。傳遞的是數組的首地址或指針的值,而形參接收到的是地址,即指向實參的存儲單元,形參和實參佔用相同的存儲單元,即形參和實參是相同的。
特點
- 形參並不存在存儲空間,編譯系統不爲形參數組分配內存。因此在數組名或指針作函數參數時所進行的傳送只是地址傳送,形參在取得該地址之後,與實參共同擁有一段內存空間,形參的變化也就是實參的變化。
示意圖
注意:這裏也有一個隱含動作,如下代碼所示:
x = &a;
y = &b;
分別將a的地址,b的地址賦值給x和y,這樣swap2函數操作的數其實就是a和b。
代碼演示
void swap2(int* x,int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
printf("x = %d y = %d\n",*x,*y);
}
int main(int argc, char *argv[])
{
int a = 12,b = 24;
swap2(&a,&b); //地址傳遞
printf("a = %d b = %d",a,b);
}
運行結果
以上就是C語言值傳遞和地址傳遞的區別了,相信大家應該很清楚了吧!