間接参照
間接参照(かんせつさんしょう) 英: indirection とは、コンピュータのプログラミング、特にプログラミング言語において、値を、値を表すものそのもの直接によってではなく、名前や参照などにより間接的に、指し示すことおよびその参照や、それを参照して操作することである(普通「参照」はreferenceの訳語であるが、この語では普通「間接参照」で一語としている)。また、デリファレンス(英: dereference)とは、そのような参照を、参照して解決し(「参照し下し」)、値を得ることを特に指す語だが、これを指して間接参照ということもある。特にC言語のindirection operator(間接演算子)は、デリファレンスを行う演算子だが、規格の用語では間接参照と呼んでいる。
具体的にはたとえば、ある変数に割り当てられたメモリアドレスを得たり、そのアドレスによって、その変数を間接的に操作したりする。
概要
以下、C言語を例に説明する。なお、標準規格中では「〜へのポインタ」等として、「アドレス」と直接的に表現するのを避けていることがあるが、ここでは一般的な解釈すなわちポインタはアドレスとする。
C言語では、単項&演算子すなわちアドレス演算子を、変数名など左辺値(代入できるとは限らない)を持つような式の前に付けると、その式が表すものを指すアドレスを得られる。このアドレスは、対応するポインタ型の変数に、その値として代入したりできる。
単項*演算子すなわち間接演算子[1](indirection operator)を、前述のアドレスを表す式の前に付けると、それを解決して(間接参照して)、その指しているもの(の左辺値)を得られる。
実際の例
- 宣言例(「int型へのポインタ型」の変数"a"、およびint型の変数"x"を定義)
int *a; int x;
- 間接参照の例(ポインタ型の変数"a"によって、変数"x"を間接参照している。結果、x==10となる。)
a = &x; *a = 10;
多重間接参照(ポインタのポインタ)
C言語では、ポインタ型の変数などに対しても同様に、それを指すポインタを作ることができる。たとえば構造体の配列をソートする時、構造体を直接操作するのではなく、かわりにポインタの配列をソートする、ということをおこなうが、このソート操作の時にポインタを指すポインタを使う。このような強力なポインタの機能がC言語の強みであると同時にエスケープ解析などの静的コード解析を難しくしてもいる。
さらに、「ポインタのポインタのポインタ」「ポインタのポインタのポインタのポインタ」など、いくらでも作ることが出来るが、ふつう必要がなく、通常は行われない。
- ポインタのポインタの例
int **b;
脚注・参照
- ^ 「間接参照演算子」という語もネットなどで見受けられるがJISにもK&R第2版訳書にもそんな語はない