ポインタのポインタ【pointer to pointer】二重ポインタ/double pointer

ポインタのポインタとは?

ポインタ変数が格納されているメモリアドレスを値として保持するポインタ変数のこと。C言語やC++言語など低水準のメモリ操作を行えるプログラミング言語で用いられる。実際のデータに辿り着くには、アドレスの参照を二段階たどる必要がある。
ポインタのポインタのイメージ画像

通常のポインタは、整数や文字などのデータが置かれたメモリ番地を値として持つ。ポインタのポインタはその一段上に位置し、「ポインタ変数そのものが置かれている番地」を保持する。C言語では「int **p」のようにアスタリスクを二つ重ねて宣言し、最終的な値へのアクセスには「**p」と二重に間接参照する記法を使う。

代表的な用途の一つが、関数の引数を経由してポインタ変数自体を書き換える処理である。C言語では引数は値渡しが基本であるため、ポインタをそのまま渡しても関数内でそのポインタが指す先を別のアドレスへ変更することはできない。ポインタのポインタを渡すことで、関数の内側から呼び出し元のポインタ変数が保持するアドレス値を直接上書きできるようになる。

文字の配列を扱う場面でも広く使われる。C言語の文字列は文字型変数の配列へのポインタとして表現されるため、複数の文字列をまとめた配列は「char**型」になる。コマンドライン引数を受け取るmain関数のargvがこの型である。また、二次元配列を動的に構築する際にも、行ごとに確保したメモリの先頭アドレスを管理するためにポインタのポインタが使われる。

なお、参照の段階をさらに増やした三重ポインタや四重ポインタも文法上は記述できるが、構造が複雑になるほど、どの段階が実データでどの段階がアドレス情報かが把握しにくくなる。未初期化のポインタや解放済みメモリを誤って参照した場合は不正なメモリアクセスを引き起こすため、実用上は二重ポインタまでで留めることが多い。

この記事の著者 : (株)インセプト IT用語辞典 e-Words 編集部
1997年8月より「IT用語辞典 e-Words」を執筆・編集しています。累計公開記事数は1万ページ以上、累計サイト訪問者数は1億人以上です。学術論文や官公庁の資料などへも多数の記事が引用・参照されています。