值傳遞。
成都創(chuàng)新互聯(lián)基于成都重慶香港及美國等地區(qū)分布式IDC機房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)服務器托管報價,主機托管價格性價比高,為金融證券行業(yè)達州電信機房,ai人工智能服務器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業(yè)成都idc公司。
實參與形參數(shù)據(jù)傳遞有兩種方式:值傳遞與地址傳遞。
地址傳遞的形式為
int
a=b;
也就是我們所說的引用,但引用只有C++中有,所以C語言都是值傳遞的。
有些人有誤解:認為C語言的int
*p=a;不也是按地址傳遞嗎?其實不是這樣的。
深入理解值傳遞與地址傳遞就會發(fā)現(xiàn):
值傳遞是:把實參的值傳給一個變量(形參)。所以int
*p=a也是把a的地址值傳給了指針變量p
地址傳遞是:直接把地址傳進來,沒有賦給任何變量,這樣在函數(shù)體內(nèi)對形參的操作也就是對實參地操作。有這種功能的也就是引用()了。
C不支持引用傳遞,引用傳遞屬于C++特性。
如果要修改被傳遞的值,C中只能用指針傳遞。
在函數(shù)調(diào)用的時候,只是把原本參數(shù)的值賦值給了函數(shù)中的形式參數(shù)。在exchange函數(shù)中操作的是形參,沒有對原本函數(shù)做出操作,所以輸出結(jié)果是 x = 4,y = 2 a = 2,b = 4。
這次在函數(shù)調(diào)用的時候是吧a,b的地址賦值給了px,py,所以交換的是真正的a,b變量此時輸出的結(jié)果是*px = 4,*py = 2
a = 4,b =2 。
這個取地址的引用傳遞雖然看起來像值傳遞,然而確實真正的改變原來常量的值,就像下棋一樣操作的不是棋子,而是棋手。
在C語言中其實沒有引用傳參,都是值傳參。即傳遞的都是實參的副本。
如下示例,
//交換兩個參數(shù)的值,值傳參
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
int a = 2, b =1;
swap(a,b); //a,b的值不會改變,因為改變的是實參a,b的副本。
另一個示例:
//所謂的“引用傳參”,交換兩個數(shù)值
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = tem;
}
int a =2, b = 1;
swap(a, b);//a,b的值改變
其實這里引用傳參,傳遞的也是參數(shù)的副本,只是這個副本是變量a,b的地址,所以你在函數(shù)swap中你并不能通過參數(shù)改變變量a,b的地址,因為它只是一個副本,是值傳遞。但你得到變量的地址,你就可以訪問和改變變量的內(nèi)容,所以在第二個swap函數(shù)中,你可以通過*x和*y來改變實參的值,從而可以達到交換變量a,b值的效果。但這并不是引用傳遞。只是有這樣的說法。推薦你去秒秒學上看看相關的內(nèi)容,我也是從那上面學來的。
“引用傳遞做函數(shù)參數(shù)”是C++的特性,C語言不支持。
//?C語言要這樣寫:
void?Exchg3(Rect?*x,?Rect?*y){?/*?...?*/?}
//?然后傳遞指針:
Exchg3(a,?b);