ポインター

読み:ポインター
外語: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として定義されるため、互換性が長期に渡り維持でき、安全である。

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club