「間接参照」の版間の差分

タグ: 差し戻し済み
</source>
 
== 多段階の間接参照 ==
C言語では、実体があるような任意の型に対してそれを指すポインタが可能なので、ポインタに対しても同様にそれを指すポインタを定義することができる。従って、ポインタのポインタのポインタといったように、必要に応じていくらでも多段階の間接参照が利用できる。
C言語では、ポインタ型の変数などに対しても同様に、それを指すポインタを定義することができる。これを'''多重間接参照''' (multiple indirection) と呼ぶ。ポインタへのポインタは'''二重間接参照''' (double indirection) と呼ばれ、俗にダブルポインタとも言う。たとえば[[構造体]]<code>T</code>や文字列<code>char[]</code>の[[配列]]を[[ソート]]するとき、構造体や文字列のコピーにかかるコストを避けるため、構造体や文字列の配列を直接操作するのではなく、かわりに構造体を指すポインタの配列や、文字列先頭要素を指すポインタの配列をソートする、ということを行なうことがある。このソート操作の際に、ポインタを指すポインタを使う。このような強力なポインタの機能がC言語の強みであると同時に、[[エスケープ解析]]などの[[静的コード解析]]を難しくしてもいる。
 
C言語では、ポインタ型の変数などに対しても同様に、それを指すポインタを定義することができる。これを'''多重間接参照''' (multiple indirection) と呼ぶ。ポインタへのポインタは'''二重間接参照''' (double indirection) と呼ばれ、俗にダブルポインタとも言う。たとえば[[構造体]]<code>T</code>や文字列<code>char[]</code>の[[配列]]を[[ソート]]するとき、構造体や文字列のコピーにかかるコストを避けるため、構造体や文字列の配列を直接操作するのではなく、かわりに構造体を指すポインタの配列や、文字列先頭要素を指すポインタの配列をソートする、ということを行なうことがある。このソート操作の際に、ポインタを指すポインタを使う。このような強力なポインタの機能がC言語の強みであると同時に、[[エスケープ解析]]などの[[静的コード解析]]を難しくしてもいる。
[[Pascal]]でも同様に可能であり、初期のMacintoshのAPIにおいて、メモリ管理をしやすくするために、「ハンドル」と呼ぶ、ポインタへのポインタを使用していた(参考: [[:en:Mac OS memory management#Fragmentation]])。
 
[[Pascal]]でも同様に可能であり、初期のMacintoshのAPIにおいて、メモリ管理をしやすくするために、「ハンドル」と呼ぶ、ポインタへのポインタを使用していた(参考: [[:en:Mac OS memory management#Fragmentation]])。
さらに、「ポインタのポインタのポインタ」「ポインタのポインタのポインタのポインタ」など、いくらでも定義することができるが、通常は必要がないため利用されない。
 
* ポインタへのポインタの例