在C/C++中,有3種函數參數傳遞方式,分別是:值傳遞、地址傳遞以及引用傳遞。(Ps:嚴謹來說,引用傳遞是C++的語法中才有的,C中只有值傳遞和地址傳遞這兩種方式)
注意:
- 形參只有在函數被調用時纔會被臨時分配內存空間,當調用結束時內存便會被釋放
- 地址傳遞本質上也是值傳遞,二者傳遞的都是實參值的一個拷貝
- 在C中,實參與形參之間的參數傳遞是單向的,即只能由實參傳遞給形參,反之則不行
值傳遞
由於值傳遞比較簡單,就不細說了,需要明確的是,由於形參操作的只是實參的一個副本,因此對形參的操作並不會改變實參的值
地址傳遞
以下面一段代碼爲例:
#include <stdio.h>
//值傳遞傳地址
void swap( int *x, int *y);
int main()
{
int a=5,b=8;
printf("傳參前:實參爲&a,&b\na=%d,地址爲%d\nb=%d,地址爲%d\n\n",a,&a,b,&b);
swap(&a,&b);
printf("傳參後:實參爲&a,&b\na=%d,地址爲%d\nb=%d,地址爲%d\n\n",a,&a,b,&b);
return 0;
}
void swap(int *x,int *y)
{
int *tmp= NULL;
tmp=x;
x=y;
y=tmp;
printf("在被調函數中:形參爲*x,*y\n*x=%d,x=%d,地址爲%d\n*y=%d,y=%d,地址爲%d\n\n",*x,x,&x,*y,y,&y);
}
運行結果如下:
在地址傳遞中,我們闊以看到,經過參數傳遞後,實參的值被“改變”了,a變成了8,而b變爲了5。但本質上,實參的值並未發生變化,這是由於在調用函數swap()時,傳入的實參其實是&a和&b,而非a和b,傳參後,從上圖可以看出,實參&a和&b的值並未改變,仍然是a和b的地址。因此,對於地址傳遞來說,其本質上就是值傳遞,而值傳遞不改變實參的值。
至於a和b的值在地址傳遞時爲什麼發生了改變,則是由於在被調函數中將指針指向了真實的變量a和b的地址,而對指針所指地址的內容的改變能夠反映到函數外,也就改變了函數外的變量a和b的值。
引用傳遞
引用傳遞是C++中才有的,變量的引用相當於爲變量起了一個別名(覺得不好理解的話,就把他當作這個變量),因此將變量的引用作爲實參傳遞時,形參改變就會引起實參的改變(因爲實參和形參是指的同一個變量,形參變實參自然會跟着改變)