間接参照

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

間接参照(かんせつさんしょう) 英: indirection とは、コンピュータプログラミング、特にプログラミング言語において、を、値を表すものそのもの直接によってではなく、名前や参照などにより間接的に、指し示すことおよびその参照や、それを参照して操作することである(普通「参照」はreferenceの訳語であるが、この語では普通「間接参照」で一語としている)。また、デリファレンス(英: dereference)とは、そのような参照を、参照して解決し(「参照し下し」)、値を得ることを特に指す語だが、これを指して間接参照ということもある。特にC言語のindirection operator(間接演算子)は、デリファレンスを行う演算子だが、規格の用語では間接参照と呼んでいる。デリファレンスは、大変しばしば「逆参照」と訳されているが[1]、誤訳である。

具体的にはたとえば、ある変数に割り当てられたメモリアドレスを得たり、そのアドレスによって、その変数を間接的に操作したりする。

概要[編集]

以下、C言語を例に説明する。なお、標準規格中では「〜へのポインタ」等として、「アドレス」と直接的に表現するのを避けていることがあるが、ここでは一般的な解釈すなわちポインタはアドレスとする。

C言語では、単項&演算子すなわちアドレス演算子を、変数名など左辺値(代入できるとは限らない)を持つようなの前に付けると、その式が表すものを指すアドレスを得られる。このアドレスは、対応するポインタ型の変数に、その値として代入したりできる。

単項*演算子すなわち間接演算子[2](indirection operator)を、前述のアドレスを表す式の前に付けると、それを解決して(間接参照して)、その指しているもの(の左辺値)を得られる。

インダイレクションは、実装上のテクニックにとどまるものではなく、たとえばデビッド・ホイーラーによる格言 "All problems in computer science can be solved by another level of indirection." が示すように、問題の解決のためにしばしば必要なものである。

実際の例[編集]

  • 宣言例(「int型へのポインタ型」の変数"a"、およびint型の変数"x"を定義)
int *a;
int x;
  • 間接参照の例(ポインタ型の変数"a"によって、変数"x"を間接参照している。結果、x==10となる。)
a = &x;
*a = 10;

多重間接参照(ポインタのポインタ)[編集]

C言語では、ポインタ型の変数などに対しても同様に、それを指すポインタを作ることができる。たとえば構造体配列ソートする時、構造体を直接操作するのではなく、かわりにポインタの配列をソートする、ということをおこなうが、このソート操作の時にポインタを指すポインタを使う。このような強力なポインタの機能がC言語の強みであると同時にエスケープ解析などの静的コード解析を難しくしてもいる。

Pascalでも同様に可能であり、初期のMacintoshのAPIにおいて、メモリ管理をしやすくするために、「ハンドル」と呼ぶ、ポインタへのポインタを使用していた(参考: en:Mac OS memory management#Fragmentation)。

さらに、「ポインタのポインタのポインタ」「ポインタのポインタのポインタのポインタ」など、いくらでも作ることが出来るが、ふつう必要がなく、通常は行われない。

  • ポインタのポインタの例
int **b;

脚注・参照[編集]

  1. ^ たとえばK&Rの訳書
  2. ^ 「間接参照演算子」という語もネットなどで見受けられるがJISにもK&R第2版訳書にもそんな語はない