2017-02-23 3 views
3

一般的な質問が1つありますが、ポインタのアドレスを参照として渡せないのはなぜですか?関数内の参照としてのポインタアドレス

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? 

私は(string* foo)を受け入れるように機能domdomを変更することができます知っているが、それへのポインタと与えられた関数を使用して機能にstring foosoを変更することも可能ですか?

+1

'string * p_foos = fooso;'はエラーです。コンパイラの出力を確認してください。 –

答えて

6

なぜポインタのアドレスを参照として渡せませんか?

これは言語が定義されているためです。直接実際のオブジェクトを

domdom(*p_fooso); 

または、渡す:

代わりに、あなたはポインタデリファレンス文字列への参照を取得することができます

domdom(fooso); 
また

は注意して「string* p_fooso = fooso; doesnのtコンパイルします。 string* p_fooso = &fooso;と書かなければなりません。

+0

ありがとう、私は参照が同様にポインタが同様にアドレスを保存すると思った。 – Ammy

+0

@Ammy参考資料*は内部的にアドレスを保存しますが、非常に異なる方法で使用されるため、2つのアドレスは意図的に交換できなくなります。 – user4815162342

2

p_foosoを文字列参照型として宣言するだけです。 変数名をr_foosoに変更したい場合があります。

string& r_fooso=fooso; 
1

ポインタと参照は、ボンネットの下に似ていますが、混乱を避けるために、なぜ暗黙的な変換することによって、それらを混合は、C++で許可されていないされ、別々に使用されています。

の場合は、参照のポインタを明示的にポインタに変換することはできますが、ではコピーのオーバーヘッドが発生しません。たとえば、関数をdomdom(*p_fooso)と呼び出すと、になります。つまり、関数はポインタを逆参照することによって得られる正確なオブジェクトへの参照を受け取ります。

関連する問題