2017-02-23 150 views
3

我有一個普遍的問題,爲什麼我不能傳遞指針的地址作爲參考?函數指針地址作爲參考

void domdom(string &foo) 
{ 
foo = ""; 
} 

string fooso = "blabal"; 
string* p_fooso = fooso; 

domdom(p_fooso); // <-- why is that not possible? And what should I pass to be able to modify foosoo? 

我知道我可以改變功能domdom接受(string* foo),但是它也可以通過使用指針,並給定函數來修改功能string fooso

+1

'string * p_fooso = fooso;'是一個錯誤;檢查你的編譯器輸出。 –

回答

6

爲什麼我不能傳遞指針的地址作爲參考?

因爲這就是語言的定義。直接

domdom(*p_fooso); 

,或者通過實際的對象:

相反,你可以取消引用指針到達這個字符串的引用

domdom(fooso); 

還要注意的是string* p_fooso = fooso;沒有按」編譯。你必須寫string* p_fooso = &fooso;

+0

謝謝,我認爲引用保存的地址以及指針以相同的方式保存。 – Ammy

+0

@Ammy引用* *保存內部地址,但以非常不同的方式使用,所以兩者有意不可互換。 – user4815162342

2

只需將p_fooso聲明爲字符串引用類型即可。 您可能想要將變量重命名爲r_fooso!

string& r_fooso=fooso; 
1

指針和引用是引擎蓋下類似,但使用不同的,這就是爲什麼由隱式轉換混合它們不是由C++允許的,以避免混淆。

但是,您總是可以明確地將引用轉換爲指針,反之亦然,沒有會產生副本的開銷。例如,如果您將該函數作爲domdom(*p_fooso)調用,則您的獲得期望的效果,即該函數將接收對通過取消引用指針而獲得的確切對象的引用。