C のポインタは、別のポインタを指すことができる。これを多重間接参照と言い、最初のポインタは2番めのポインタのアドレスを保持し、2番めのポインタが変数へのアドレスを保持する。
ポインタへのポインタを宣言するには * を2つつける。
char **mp;
ポインタへのポインタが、間接的に指している値を参照するときには * 演算子を2つつける。例えば次のように。
char **mp, *p, ch; p = &ch; /* ch のアドレスを取得 */ mp = &p; /* p のアドレスを取得 */ **mp = 'A' /* 多重間接参照を使って ch に 'A' を代入 */
次のプログラムは、ポインタへのポインタを使って、 gets() で文字列を入力する。
#include int main(void) { char **mp, *p, str[80]; p = str; mp = &p; printf("Input your name: "); gets(*mp); printf("Hello, %s!\n", *mp); return 0; }
gets や printf の引数で、mp に * が1つしかついていないことに注目。これらの関数の引数には、文字列へのポインタが要求されるからだ。2つつけると文字列の最初の文字の値になってしまう。
takatoh@nightschool $ ./sample_6_6 Input your name: Andy Hello, Andy!