2012-07-17 40 views
1

是什麼下面的代碼的區別: -差異由指針-C++傳遞

int a; 
int *p; 
p=&a; 
function(p); 

int a; 
function(&a); 

我在讀一本書,有時他們使用的第一個代碼,有時另一個。它不是一本好書(由當地作者撰寫)。

這兩個代碼的工作方式是一樣還是有區別?

在效率方面也有什麼不同嗎?它有多重要?

謝謝

+1

這裏沒有提及(除非你有一個指針的引用),但如果你不能添加它們,請使用第二個。我至少在處理這種情況時,從來沒有必要使用第一種。 – chris 2012-07-17 14:21:27

+0

代碼中沒有引用。在這兩種情況下,你都通過指針傳遞。這個原因沒有區別。如果您打算詢問有關參考資料,請查看您的問題。 – AnT 2012-07-17 14:21:29

+0

不好意思,那麼通過引用是什麼意思? – Aditya 2012-07-17 14:25:01

回答

1

據我所知,編譯器實現引用作爲指針。所以應該沒有差異的表現。但引用更嚴格,可以保護你免於犯錯誤。例如,您不能重新綁定引用或不能使用它們執行算術運算

另外有些人會優先傳遞指向修改對象的函數的指針。例如

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 
} 
+0

你讀過這個問題了嗎? – 2012-07-17 14:22:57

+0

是的,標題是誤導性的。 – chris 2012-07-17 14:24:32

+0

如果你以面值閱讀這個問題,那基本上是無稽之談。我認爲@andrew正在閱讀各行,這很有幫助。 – tenfour 2012-07-17 14:25:11

2

對於參考,對象必須是已經存在的,以引用它。作爲一個指針,該對象不需要是已經聲明指針時現有

實施例:

int &i = 10;  //Invalid 
const int &i = 10; //Valid 

不能聲明引用數組:

int &tab[] = {2,3}; //Invalid 
int * tab[] = {2,3}; //Valid 

實際上,引用主要用作函數參數和返回值;

+0

對不起,你能解釋一下嗎? – Aditya 2012-07-17 14:26:02

+0

@Aditya看到我的編輯 – 2012-07-17 14:35:31

+0

嗯,謝謝,幫助我。 – Aditya 2012-07-17 14:42:48

0

在上面的兩種方法中,兩者都使用指針,除了等於sizeof(int *)的內存將被分配到堆棧上的「int * p」之外沒有區別。

以引用方式引用的情況下,Refer。看起來你是初學者和學習的東西,你會更多地瞭解通過引用傳遞和使用更多,而在類中使用複製構造函數。

+0

感謝您的參考。 – Aditya 2012-07-17 14:34:49

0

當使用現代編譯器進行編譯時,這兩個代碼片段應該是等效的。額外的聲明和分配(p=&a;)已經過優化。