ポインター
読み:ポインター
外語:pointer

 あるものを指し示すもの。
目次

概要
 「指し示すもの」であれば、基本的には何でもポインターである。
 一般には、次のようなものをポインターとして扱っている。

プログラミング言語

ポインターの概念
 PascalCC++などのプログラミング言語は、値のありかをポインターによって表現することが出来る。このため、アセンブリ言語並の機能性と汎用性を持つ。また、プログラミングではポインターを使いこなすことが一つの課題であった。
 CやC++の多くの処理系では、ポインターの概念を表現するために、データのアドレス、すなわち単なる数値を流用している。
 このためアドレスとポインターはほぼ同義だが、ポインターはアドレスの他にデータ型(char、int、longなど)という情報を持っている点が異なる。
 このような環境では、任意の数値が意味のないポインターとして解釈され、妥当なデータを指さない場合が多々あり、これが、メモリー破壊など発見困難なバグの原因となる。単なる数値である以上、これに対して加減算が行なえ、ポインターは容易にデータ領域の外を指せてしまう点が、これに拍車を駆けている。

ポインター性悪説
 こうして、いつの頃からか、プログラミングでは「ポインター性悪説」が主流をなすようになった。また、ポインターを上手く扱えない人が力を付けたためか、Javaなど20世紀末頃から登場しだした自称「モダンな言語」ではポインターをサポートしないとされている。
 しかし、存在しないのは、単なるアドレスをポインターとして解釈する実装であり、ポインターの概念がないわけではない。事実Javaではintdoubleのようなプリミティブ型以外のデータは全て「ポインター」を使わなければ使用できない。
 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_tuintptr_tを定義した。その環境に応じて適切な変数のtypedefとして定義されるため、互換性が長期に渡り維持でき、安全である。

再検索