傳地址調用和傳引用調用的區別
相同點:
傳引用和傳地址,原理上都是將參數變量的地址傳遞給被調函數。所以在函數內部修改參數的值時,均可返回修改之後的結果給調用者。
不同點:
引用一定會指向一個對象,而指針可能爲空(NULL); 傳引用時,系統對傳過來的參數不會有任何額外開銷,直接使用原始變量的內存空間。
傳引用時,函數參數需要寫做T&a; 調用函數時直接傳遞對象本身;在函數內賦值的時候,直接對a賦值即可。
傳地址時,函數參數需要寫作T*p;調用函數時需要傳入對象地址; 賦值時需要對*p賦值。
總結
從以上對比可以得知,傳引用調用比傳地址調用更爲簡單高效。之所以保留傳地址調用,主要是爲了兼容C語言的代碼。在C++編程時,應儘量以傳引用代替傳地址。
————————————————
版權聲明:本文爲CSDN博主「Java星」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yangxingpa/article/details/77856370
以下是我在學習過程中遇到的傳遞地址調用的程序,自己寫了和引用傳遞調用的函數作對比,c++不精通,如果那裏錯了,還望指正,謝謝。
#include <iostream>
using namespace std;
//void splitFloat( float a,int &intPart, float &floatPart )
//{
// intPart = ( int )( a );
// floatPart = a - intPart;
//}
void splitFloat( float a,int *intPart, float *floatPart )
{
*intPart = static_cast< int >( a );
*floatPart = a - *intPart;
}
void add_Ref( int &x, float &y)
{
x = 13;
y = 14;
}
int main()
{
cout << "Enter 3 float point numbers:" << endl;
float x,f;
int n;
cin >> x;
splitFloat( x, &n, &f);//傳地址調用:函數參數爲地址,需要定義指針指向這個地址
cout << "Integer: " << n << " Float: " << f << endl;//輸出整數部分和小數部分
add_Ref( n, f); //傳引用調用:函數參數爲變量名,函數形參定義爲引用
cout << "n: " << n << " f: " << f << endl;//輸出13,14
}
***************************************************************************************************************************************
2020.05.02更新
在C語言中,以下代碼執行之後,*p的值爲()
void func(int *p)
{
static int num = 4;
p = #
(*p)--;
}
int main()
{
int i = 5;
int *p = &i;
func(p);//p指向的是一個地址,傳地址調用
printf("%d", *p);
return 0;
}
這個程序中的p是傳遞的是地址,傳地址調用。
********************************************************************************************
2020/05/06 更新
#include<iostream>
using namespace std;
void f(int *p,int *q)
{
//p++;
(*p)++;
*q=*q+1;
}
int main()
{
int m=1,n=2,*r=&m;
cout << "r,&n: " << r << " " << &n << endl;
f(r,&n);//n是傳引用調用
cout<< m << "," << n << endl;
return 0;
}
我們輸出r 和 &n會發現兩個都是地址,那麼函數f()就是將兩個地址傳遞給函數所定義的兩個指針,這兩個指針接收的參數都是地址,所以本質上他們是一樣的。
指針r傳遞至函數f()後,將m的地址傳遞給函數f(),f()中的指針p指向傳遞過來的m的地址,p++後指向m的下一個地址,沒有改變m的值,並且函數返回後,該指針被銷燬,m的值不變。
但如果是(*p)++ 那麼就會改變指針p指向地址中的內容,性質同*q = *q + 1 一樣了。
&n是引用傳遞,將n的地址傳遞給函數f(),並用指針指向改地址,*q = *q + 1是對q指針所指向地址中存儲的內容+1,即n值+1;而返回函數後,雖然q指針被銷燬,但是它所指向的地址中的內容已經改變。