C語言函數傳遞方式-值傳遞和地址傳遞

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語言值傳遞和地址傳遞的區別了,相信大家應該很清楚了吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章