簡體   English   中英

通過指針-C ++傳遞的差異

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM