ポインター
読み:ポインター
外語:pointer
あるものを指し示すもの。
目次
概要
プログラミング言語
ポインターの概念
ポインター性悪説
ポインターの演算
概要
「指し示すもの」であれば、基本的には何でもポインターである。
一般には、次のようなものをポインターとして扱っている。
マウスカーソル
プログラミング
での変数やルーチンが存在するアドレスを表わすための変数
資料の所在
URI
URL
URN
ネットニューズ
なら
Message-ID
など
プログラミング言語
ポインターの概念
Pascal
や
C
、
C++
などのプログラミング言語は、値のありかをポインターによって表現することが出来る。このため、
アセンブリ言語
並の機能性と汎用性を持つ。また、プログラミングではポインターを使いこなすことが一つの課題であった。
CやC++の多くの処理系では、ポインターの概念を表現するために、データのアドレス、すなわち単なる数値を流用している。
このためアドレスとポインターはほぼ同義だが、ポインターはアドレスの他に
データ型
(char、int、longなど)という情報を持っている点が異なる。
このような環境では、任意の数値が意味のないポインターとして解釈され、妥当なデータを指さない場合が多々あり、これが、
メモリー破壊
など発見困難な
バグ
の原因となる。単なる数値である以上、これに対して加減算が行なえ、ポインターは容易にデータ領域の外を指せてしまう点が、これに拍車を駆けている。
ポインター性悪説
こうして、いつの頃からか、プログラミングでは「ポインター性悪説」が主流をなすようになった。また、ポインターを上手く扱えない人が力を付けたためか、
Java
など
20世紀
末頃から登場しだした自称「モダンな言語」ではポインターをサポートしないとされている。
しかし、存在しないのは、単なるアドレスをポインターとして解釈する実装であり、ポインターの概念がないわけではない。事実Javaでは
int
や
double
のような
プリミティブ型
以外のデータは全て「ポインター」を使わなければ使用できない。
Javaにポインターが無いというのは誤った理解であり、JavaにはCで言うところのポインターが存在するがそれを「
参照
」と呼んでいる、と解釈するのが正しい。
ポインターの演算
ポインター変数も加算や減算の演算が可能である。
通常の整数型(例えばint)であれば、1を足せば当然1増える。しかし、ポインター変数の場合はそうではない。int型のポインターであれば、1足すとintの長さ分増えるのである。
int i;
int *p = &i;
++p;
32ビット環境でint長が32ビット(4オクテット)なら、pは4増えることになる。減算も同様で、また乗算や除算は出来ない。
さて、このような状況であっても、ポインターの値を正確にバイト単位で加減したいという場合があり、多くの場合、intやlongにポインター変数の内容を代入して演算するのが一般的である。しかしこの方法は互換性が大きく損なわれ、16ビット→32ビット→64ビットと世代を経る度に問題を起こし、処理の書き換えが必要となってきた。環境ごとに、ポインター長と変数長が変わるからである。
そこでC99(
ISO/IEC 9899:1999
)では、ポインター保持に充分な大きさの整数型として、
intptr_t
と
uintptr_t
を定義した。その環境に応じて適切な変数のtypedefとして定義されるため、互換性が長期に渡り維持でき、安全である。
再検索