[英]Difference in passing by pointer -C++
以下代碼有什么區別: -
int a;
int *p;
p=&a;
function(p);
和
int a;
function(&a);
我正在讀一本書,有時他們使用的是第一個代碼,有時使用另一個代碼。 雖然不是一本好書(由當地作家)。
兩個代碼是否會以相同的方式工作,或者有什么區別?
在效率方面是否有任何差異,這是否重要?
謝謝
作為參考,該對象必須已經存在才能引用它。 對於指針,在聲明指針時不需要存在對象
例:
int &i = 10; //Invalid
const int &i = 10; //Valid
也
你不能聲明一個引用數組:
int &tab[] = {2,3}; //Invalid
int * tab[] = {2,3}; //Valid
實際上,引用主要用作函數參數和返回值;
據我所知,編譯器將引用實現為指針。 所以性能應該沒有區別。 但引用更嚴格,可以保護您不犯錯誤。 例如,您無法重新引用引用或無法對它們執行算術運算
還有一些人喜歡將指針傳遞給修改對象的函數。 例如
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
}
在上面兩種方法中,兩者都使用指針,沒有區別,除了等於sizeof(int *)的內存將在堆棧上為“int * p”分配。
如果是參考呼叫, 請參閱 。 看起來你是初學者和學習的東西,在類中使用復制構造函數時,你會更多地了解通過引用傳遞及其使用。
使用現代編譯器編譯時,這兩個代碼片段應該是等效的。 額外的聲明和賦值( p=&a;
)被優化掉了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.