2012-12-25 16 views
5

を、私はちょっとCで初心者くさいい++および参照とポインタの違いは私には非常にあいまいである私は、コード参照と同じ命令にデリファレンス

MachineInstr *MI = &*I; 

のこの行につまずいLLVMのソースコードを疑問に思う、と私はこの違いについて何かすることがあると思いますが、この操作は私には意味がありません。誰かがそのことを説明していますか?

+0

あなたは疑問に思うのですか? – jalf

+0

@jalf:「同じ命令での参照と逆参照」というタイトルについては、すべてがyesを指していると信じています) – Zeta

+0

@ jalf:まさに:)その理由は何もありません –

答えて

8

Iのタイプは、おそらく一元語operator*()MachineInstr&になるようにオーバーロードされたイテレータまたはスマートポインタです。 Iによって参照されるオブジェクトへの組み込みポインタを取得する場合は、*Iを使用してオブジェクトへの参照を取得し、&*Iを使用してこの参照のアドレスを取得します。

+0

'I'は実際にはイテレータです。これは完全に感知します:) –

+0

'I'が*ちょっと*ポインタの場合、これは意味をなさない。ほとんどの場合、それはスマートポインタ(ポインタのように「振る舞う」クラス)です。生ポインタの場合、 '*'と '&'は効果的に互いに打ち消し合います。しかし、スマートポインタの場合、これは指し示されたオブジェクトへの*生*ポインタを取得する方法です – jalf

+0

申し訳ありません、私はイテレータを意味し、ポインタを書きました。私の悪い –

2

C++では、逆参照演算子のオーバーロードが許可されているため、オブジェクトでオーバーロードされたメソッドを使用しています。結果のアドレスを取得してポインタに配置しています。

+2

アドレス演算子(接頭辞 '&')も再定義することができますが、通常のコードではそれを行わないので、通常は無視できます。 – delnan

+0

@delnan:偶然にも、その場合でも[strange tricks](http://stackoverflow.com/q/6494591/214671)でアドレスを取得できます。 –

+0

@delnanそれはとても楽しいでしょう:P –

2

この文:

MachineInstr *MI = &*I; 

間接参照*I、および&とその結果のアドレスを取得しますが、その後MachineInstrへのポインタであるMIに割り当てます。 Iはイテレータなので、*Iはコンテナに格納された値です。イテレータは*演算子を定義して反復ポイントでアイテムを返すためです。コンテナ(リストなど)にはMachineInstrが含まれている必要があります。これはstd::list<MachineInstr>である可能性があります。

関連する問題