2011-10-06 67 views
1
foo(int &bar) 
{ 
    bar = 5; 
} 

這個函數的調用將初學者參考類型參數混亂

int foobar = 2; 

foo(foobar); 

我是正確的思想,函數參數本質上是「得」變量的內存地址,但不會再有將在foo中被解除引用,並且我會改變foobar的原始值?在此之前我的印象是,你將不得不在內存地址這樣的經過:

foo(&foobar); 

,然後使用變量中富這樣的:

*bar = 5; 

我是正確的思想,這是錯誤的?我認爲,就像許多初學者一樣,混淆來自於認爲引用就像一個指針,因爲它擁有一個內存地址,但它從來都不是一種類型?只是一個操作員。

+0

'foo(&bar){}'不是一個合適的C++函數定義。 –

+0

http://stackoverflow.com/questions/620604/difference-between-a-pointer-and-reference-parameter的精確重複? – mydogisbox

+0

不完全是這樣,我對於傳遞指針和傳遞作爲參考之間的區別並不感到困惑,而是你如何使用「引用變量」這麼說。 – SirYakalot

回答

1

引用通常通過底層指針來實現(儘管這不是標準要求的),但它們是與指針完全不同的野獸。引用僅僅是一個現有變量的新名稱或別名。當你做

void foo(int& bar) 
{ 
    bar = 5; 
} 

int foobar = 2; 
foo(foobar); 

要調用foo與變foobar進行評估,所以內foo基本bar becames foobar。這通常編譯器impementation是實際執行這段代碼是這樣的:

void foo(int* bar) 
{ 
    *bar = 5; 
} 

int foobar = 2; 
foo(&foobar); 
+0

那麼,只需堅持指針參數,它是更可接受的編碼習慣嗎? – SirYakalot

+0

@SirYakalot:不,如果有的話,則相反。語言中有兩個地方。 –

0

如果你這樣做:

void foo(int& bar) { bar = 6; } 

int main() { 
    int x = 3; 
    foo(x); 
} 

X在主就等於6,這是因爲一個參考/別名(一相同變量的不同名稱)傳遞給foo。因此,函數foo中的bar與main中的x,相同的內存位置以及所有內容相同。

這是正常的傳球像這樣不同:

void foo(int bar) { bar = 6; } 

int main() { 
    int x = 3; 
    foo(x); 
} 

哪裏酒吧是從X在main(注複製一個新的副本構造值拷貝構造函數能更好地適用於非標量型,但這個想法是一樣的)。

最後,如果你這樣做:

void foo(int* bar) { *bar = 6; } 

int main() { 
    int x = 3; 
    foo(&x); 
} 

它會說:「我想一個指向整數」爲Foo的參數。主要的是,我們將「棧變量x的地址」與x的指針本質上是同一個東西,然後我們將它傳遞給bar。然後,取消引用欄並將其分配給6會使主元素中的x等於6 :)