ポインタ (プログラミング)
ポインタ (英: pointer) とは、コンピュータプログラミングにおいて、変数や定数、サブルーチン(関数)などが置かれたメインメモリ上の番地(メモリアドレス)を格納するための特殊な変数のこと。あるオブジェクトがなんらかの論理的位置情報に基づいてアクセスできるとき、それを参照する(指し示す)ためのものである。一般的な意味での「ポインタ」は「何かの位置を指し示すための仕組みや道具」のことであり、転じてコンピュータプログラミングの分野ではメモリアドレス参照の意味で使われるようになった。
バイト単位のアドレッシングが必要な場合、char / signed char / unsigned charへのポインタを利用する。これらの型はサイズが1であることが規格で保証されているため、これらの型へのポインタに対する加減算操作はバイト単位のアドレッシングとなる。
なお、汎用ポインタvoid*は型が不明のため、アドレスの加減算を行なうことができないが、GCC拡張の非標準動作ではvoid型のサイズに1を割り当てるため、加減算が可能となっている。
ポインタ型のサイズは処理系依存であり、通例ターゲットとするプロセッサアーキテクチャのレジスタ幅と同じサイズを持つ。
オフセット計算などでポインタ間の差を得る必要がある場合、<stddef.h>で定義されているptrdiff_t型を用いる。ポインタ(アドレス値)を整数型に代入する必要がある場合、<stdint.h>で定義されているポインタ互換の整数型intptr_tやuintptr_tを用いる(C99およびC++11で標準化されている)。なお、C/C++ではintやlongなどの組み込み整数型のサイズもまた処理系依存である。移植性を損なうため、ポインタを扱う目的で組み込み整数型を直接使用してはならない。
宣言例
アスタリスク*前後のスペースの有無は任意である。
上記の2つの変数nとptrは、以下のようにまとめて宣言することもできるが、混乱を招く恐れがある。
複数のポインタ変数をまとめて宣言する場合は、以下のように書く必要がある。
何も指していないポインタ(ヌルポインタ)
C言語の処理系では通例、無効なポインタを示す値として下記のようなNULLマクロが定義されている。
C言語では、voidへのポインタは任意の型へのポインタに自由に代入することができる。ポインタに無効値を代入する場合、通例このNULLマクロを使う。
一方、C++では、NULLは整数定数のゼロに等しい。
そのため、C++では下記のように書くこともできる。
C++ではNULLが整数定数のゼロに等しいことから起こる関数オーバーロードのルックアップに関する問題を解決するため、C++11以降では、std::nullptr_t型として評価されるキーワードnullptrが定義された。C++11以降でもNULLは引き続き利用可能だが、整数定数のゼロに等しいとは限らず、実装は処理系依存となる。
利用例
下記はポインタptrの参照先である変数nに整数値10を代入することになる。
配列とポインタ
C言語における配列(固定長配列)とポインタはそれぞれ異なるデータ型であるが、配列の添え字演算子は、ポインタの加減算とデリファレンスの糖衣構文である。
実行時に要素数の決まる配列を作成する際など、動的にメモリ領域を確保するときは結果をポインタで受け取る。確保したメモリを解放するときもポインタを利用する。