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

通常のポインタは、整数や文字などのデータが置かれたメモリ番地を値として持つ。ポインタのポインタはその一段上に位置し、「ポインタ変数そのものが置かれている番地」を保持する。C言語では「int **p」のようにアスタリスクを二つ重ねて宣言し、最終的な値へのアクセスには「**p」と二重に間接参照する記法を使う。
代表的な用途の一つが、関数の引数を経由してポインタ変数自体を書き換える処理である。C言語では引数は値渡しが基本であるため、ポインタをそのまま渡しても関数内でそのポインタが指す先を別のアドレスへ変更することはできない。ポインタのポインタを渡すことで、関数の内側から呼び出し元のポインタ変数が保持するアドレス値を直接上書きできるようになる。
文字の配列を扱う場面でも広く使われる。C言語の文字列は文字型変数の配列へのポインタとして表現されるため、複数の文字列をまとめた配列は「char**型」になる。コマンドライン引数を受け取るmain関数のargvがこの型である。また、二次元配列を動的に構築する際にも、行ごとに確保したメモリの先頭アドレスを管理するためにポインタのポインタが使われる。
なお、参照の段階をさらに増やした三重ポインタや四重ポインタも文法上は記述できるが、構造が複雑になるほど、どの段階が実データでどの段階がアドレス情報かが把握しにくくなる。未初期化のポインタや解放済みメモリを誤って参照した場合は不正なメモリアクセスを引き起こすため、実用上は二重ポインタまでで留めることが多い。