ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
あるものを指し示すもの。
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として定義されるため、互換性が長期に渡り維持でき、安全である。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます