間接参照

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。MetaNest (会話 | 投稿記録) による 2011年5月6日 (金) 08:33個人設定で未設定ならUTC)時点の版 (→‎概要)であり、現在の版とは大きく異なる場合があります。

間接参照(かんせつさんしょう) 英: 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;

脚注・参照

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