ポインター |
辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS) |
読み:ポインター |
外語:pointer |
品詞:名詞 |
あるものを指し示すもの。
|
概要 |
「指し示すもの」であれば、基本的には何でもポインターである。
一般には、次のようなものをポインターとして扱っている。
プログラミング言語 |
ポインターの概念 |
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として定義されるため、互換性が長期に渡り維持でき、安全である。
リンク |
通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022) Search System : Copyright © Mirai corporation Dictionary : Copyright © WDIC Creators club |