是什麼下面的代碼的區別: -差異由指針-C++傳遞
int a;
int *p;
p=&a;
function(p);
和
int a;
function(&a);
我在讀一本書,有時他們使用的第一個代碼,有時另一個。它不是一本好書(由當地作者撰寫)。
這兩個代碼的工作方式是一樣還是有區別?
在效率方面也有什麼不同嗎?它有多重要?
謝謝
是什麼下面的代碼的區別: -差異由指針-C++傳遞
int a;
int *p;
p=&a;
function(p);
和
int a;
function(&a);
我在讀一本書,有時他們使用的第一個代碼,有時另一個。它不是一本好書(由當地作者撰寫)。
這兩個代碼的工作方式是一樣還是有區別?
在效率方面也有什麼不同嗎?它有多重要?
謝謝
據我所知,編譯器實現引用作爲指針。所以應該沒有差異的表現。但引用更嚴格,可以保護你免於犯錯誤。例如,您不能重新綁定引用或不能使用它們執行算術運算
另外有些人會優先傳遞指向修改對象的函數的指針。例如
void changeVal(int *p)
{
*p = 10;
}
他們說,當你看到它更具可讀性:
changeVal(&var)
比
changeVal(var);
編輯
你能想到的reference
作爲的另一個名字它指的是對象。因此對reference
所做的所有更改都將應用於該對象。下面是一個例子:
void foo_copy(int a) //pass by copy
{
a = 10; //changes copy
}
void foo(int &a) //bass by reference
{
a = 10; //changes passed value
}
void foo(int *a) //pass an adress of a
{
(*a) = 10; //change a value pointed by a
a = nullptr; //change a (the pointer). value is not affected
}
對於參考,對象必須是已經存在的,以引用它。作爲一個指針,該對象不需要是已經聲明指針時現有
實施例:
int &i = 10; //Invalid
const int &i = 10; //Valid
也
不能聲明引用數組:
int &tab[] = {2,3}; //Invalid
int * tab[] = {2,3}; //Valid
實際上,引用主要用作函數參數和返回值;
當使用現代編譯器進行編譯時,這兩個代碼片段應該是等效的。額外的聲明和分配(p=&a;
)已經過優化。
這裏沒有提及(除非你有一個指針的引用),但如果你不能添加它們,請使用第二個。我至少在處理這種情況時,從來沒有必要使用第一種。 – chris 2012-07-17 14:21:27
代碼中沒有引用。在這兩種情況下,你都通過指針傳遞。這個原因沒有區別。如果您打算詢問有關參考資料,請查看您的問題。 – AnT 2012-07-17 14:21:29
不好意思,那麼通過引用是什麼意思? – Aditya 2012-07-17 14:25:01