溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

函數的傳值調用,傳址調用和引用調用分析

發(fā)布時間:2020-07-28 14:51:19 來源:網絡 閱讀:721 作者:巖梟 欄目:編程語言

函數的傳值調用和傳址調用在CC++中都是合法的語法,但是引用調用就只是在C++中合法的。

1.傳值調用

程序:

#include<stdio.h>


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的值也就隨之銷毀了,所以根本不會對行參有任何影響,當然就不會實現實參的交換。

 

2.傳址調用

程序:

#include<stdio.h>


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ù). . .

分析:完成了交換,原因是這樣的,傳址調用實際上還是實參到形參的拷貝,不過這次實參是要交換的兩個數字的指針(即地址),而不是要交換的兩個數本身,雖然形參在swap結束后被銷毀,但是形參是根據要交換的兩個數的地址完成交換的,所以對這兩個數字產生影響,也就完成交換。

 

3.引用調用

這個語法在C++里合法,但是在C里面是沒有的

程序1

#include<stdio.h>


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<iostream>

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ù). . .

 

分析:可以看到實現了兩個數字的交換,但是這里的語法和上面的兩種都不一樣,這里并沒有實參到形參的拷貝,用的是同一塊內存空間,而是直接將main里面的a, b傳到swap里面,所以當然交換的就是a, b的值。

 

建議:對于內部數據類型的輸入參數,不要將“值傳遞”的方式改為“const 引用傳遞”。否則既達不到提高效率的目的,又降低了函數的可理解性。例如void Func(int x) 不應該改為void Func(const int &x),只是建議在傳結構體或類對象的時候使用const 參數。

 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI