ポインター変数
読み:ポインターへんすう

 CC++などにある機能で、ポインターを格納するための変数のこと。
目次

概要
 現在の一般的な電子計算機は「ノイマン型電子計算機」と呼ばれており、ある単位(バイト)で区切られた空間に主たる情報を格納する。
 そして、区切られた各単位ごとに、一意の(ほかと重複しない)番地番号(これをアドレスという。以下同)が振られている。
 アドレスは一般に0以上の整数だが、その最大値はそのコンピューター、より正確にはCPUの仕様により決まる。
 このようにしてアドレスで示される空間をアドレス空間といい、このアドレス空間の「ある一つのアドレスを格納する変数」を、ポインター変数という。

特徴

使用目的
 Cは、元々はアセンブリ言語の代わりとして作られた言語であるため、アセンブリ言語相当の機能が必要だった。
 従って、アドレス空間を直接的に表現できる、ポインター変数という機能が言語機能として採用されたのである。
 アドレス空間には、そのコンピューター、更に言えばCPUの仕様にもよるが、メインメモリーBIOSなどのROM、装置のI/Oポート(メモリーマップドI/O)などが割り当てられている。
 ポインター変数を使えば、CPUから参照できる全てのアドレスを表わすことができるため、これらを直接制御するプログラムを書くことができ便利であるが、その反面誤ったアドレスを操作するとコンピューター全体の動作をおかしくする可能性があり、危険でもある。

変数の中身
 ポインター変数として定義された変数には、アドレスが数値として格納されている。実際のデータは入っていない。
 実際のデータを参照する時には、ポインター変数をポインター演算子と共に使う。
 C/C++を例とすると、この変数が示す実際のデータが欲しいとき、つまりこの変数で示されるアドレス空間に対して読み書きをしたい場合は、変数の頭に間接演算子*を付けて記述する。
 この変数に格納されているアドレスそのものを参照したい場合は、変数名をそのまま書く。
 この変数の所在するアドレスは通常の変数と同様に参照演算子&を使う。応用すれば、変数の中身は&変数名[0]で得られる。

変数の大きさ
 読み書きする場合の大きさは、ポインター変数を定義する際に決められる。よくあるのはcharunsigned charである。
 char *p1;
 ポインター変数は通常の変数と違い、変数名の前に*を付けて定義する。
 また必要に応じて、intであるとか、unsigned longなども使われる。
 int *p2;
 unsigned long *p3;

演算
 通常の数値変数に対する演算(加減乗除など)であれば、例えば1の加算であれば結果も1増える。しかし、ポインター変数の場合には注意が必要である。
 char *pc;
 long *pl;
 ++pc;
 ++pl;
 二つの変数の演算結果は同じではない。pc変数はプラス1されるが、pl変数はプラス4される(longが32ビットの環境の場合)。
 これは、plが4バイト(32ビット)変数であるlongに対するポインターだからである。ポインターのインクリメントあるいは加算減算は、指定した数だけ値が増減するのではなく、指定した数だけポインターが「進むか戻るかする」のである。

再検索