函數(shù)的傳值調用和傳址調用在C和C++中都是合法的語法,但是引用調用就只是在C++中合法的。
曲阜ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
1.傳值調用:
程序:
#include
void swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
int main(void)
{
int a = 1, b = 2;
printf("a=%d, b=%d\n", a, b);
swap(a, b);
printf("a=%d, b=%d\n", a, b);
system("pause");
return 0;
}
運行結果:
a=1, b=2
a=1, b=2
請按任意鍵繼續(xù). . .
分析:并沒有完成交換,因為在傳參調用中,main調用swap時候,將實參a, b的值分別拷貝給形參x, y,然后a, b就不再和swap有關了,swap交換的是x, y的值,但是x, y的作用域只在swap中,他們確實完成了交換,但是swap結束之后,x, y的值也就隨之銷毀了,所以根本不會對行參有任何影響,當然就不會實現(xiàn)實參的交換。
2.傳址調用
程序:
#include
void swap(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main(void)
{
int a = 1, b = 2;
printf("a=%d, b=%d\n", a, b);
swap(&a, &b);
printf("a=%d, b=%d\n", a, b);
system("pause");
return 0;
}
運行結果:
a=1, b=2
a=2, b=1
請按任意鍵繼續(xù). . .
分析:完成了交換,原因是這樣的,傳址調用實際上還是實參到形參的拷貝,不過這次實參是要交換的兩個數(shù)字的指針(即地址),而不是要交換的兩個數(shù)本身,雖然形參在swap結束后被銷毀,但是形參是根據(jù)要交換的兩個數(shù)的地址完成交換的,所以對這兩個數(shù)字產生影響,也就完成交換。
3.引用調用
這個語法在C++里合法,但是在C里面是沒有的
程序1:
#include
void swap(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
}
int main(void)
{
int a = 1, b = 2;
printf("a=%d, b=%d\n", a, b);
swap(a, b);
printf("a=%d, b=%d\n", a, b);
system("pause");
return 0;
}
注意:這段代碼如果用c編譯會報錯,因為引用調用在C里面不合法,要用c++語言進行編譯。
程序2:
#include
using namespace std;
void swap(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
}
int main(void)
{
int a = 1, b = 2;
printf("a=%d, b=%d\n", a, b);
swap(a, b);
printf("a=%d, b=%d\n", a, b);
system("pause");
return 0;
}
運行結果:
a=1, b=2
a=2, b=1
請按任意鍵繼續(xù). . .
分析:可以看到實現(xiàn)了兩個數(shù)字的交換,但是這里的語法和上面的兩種都不一樣,這里并沒有實參到形參的拷貝,用的是同一塊內存空間,而是直接將main里面的a, b傳到swap里面,所以當然交換的就是a, b的值。
建議:對于內部數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const 引用傳遞”。否則既達不到提高效率的目的,又降低了函數(shù)的可理解性。例如void Func(int x) 不應該改為void Func(const int &x),只是建議在傳結構體或類對象的時候使用const 參數(shù)。