LLVMソースコードを調べて、このコード行に出くわしました
MachineInstr *MI = &*I;
私はC++の初心者であり、参照とポインターの違いは私にはまったくわかりません。この違いには何か関係があると思いますが、この操作は私には意味がありません。誰かがそれをするための説明がありますか?
のタイプは、おそらく、単項オーバーロードされて。を生成する、I
ある種のイテレータまたはスマートポインタです。によって参照されるオブジェクトへの組み込みポインターを取得する場合は、を使用してオブジェクトへの参照を取得してから、を使用してこの参照のアドレスを取得します。operator*()
MachineInstr&
I
*I
&*I
C ++では、間接参照演算子のオーバーロードが許可されているため、オブジェクトでオーバーロードされたメソッドを使用し、結果のアドレスを取得してポインターに入れます。
この文:
MachineInstr *MI = &*I;
で逆参照I
し*
、で結果のアドレスを取得してから、へのポインタであるアドレスを&
割り当てます。イテレータのように見えますが、イテレータは反復ポイントでアイテムを返す演算子を定義するため、コンテナに格納されている値も同様です。コンテナ(リストなど)には、が含まれている必要があります。これはである可能性があります。MI
MachineInstr
I
*I
*
MachineInstr
std::list<MachineInstr>