char *x[]
int *
や char *
自体が型を意味するので,例えば,
char *x[7];
という宣言は char *
型変数の配列,すなわち,ポインタの配列,「ポインタ配列」となります。この例の場合,合計7個のポインタ x[i] (i = 0, 1,...,6)
が出来上がります。
添字演算子で見たように,x + i
は第i要素のアドレスです。しかし,x + i
はポインタ x[i]
のアドレスですので,x + i
を代入できるのは「ポインタへのポインタ」となります。例えば,次のように宣言すれば,
char *x[7]; char **z;
ポインタへのポインタ z
に x + i
を代入することができます。
/* 例 */ z = x + 2;
/* Example 10.13 */ #include <stdio.h> int main(void) { char *x[10] = { "char", "short", "int", "long", "float", "double" }; char *p; char **z; for (p = *x; *p != '\0'; p++) printf("%c\t(%d)\t[%p]\n", *p, *p, p); for (z = x; *z != NULL; z++) printf("%s\t[%p]\n", *z, *z); return 0; }
実行結果です。
c (99) [0x1f04] h (104) [0x1f05] a (97) [0x1f06] r (114) [0x1f07] char [0x1f04] short [0x1f0c] int [0x1f14] long [0x1f18] float [0x1f20] double [0x1f28]
丸括弧内はその文字の ASCIIコード番号,角括弧内はアドレスです。x
は第1要素のアドレスであり,したがって,間接参照すると *x == x[0]
となります。但し,x[0]
は char
へのポインタです。最初の for
文ではポインタ p
をそのポインタ x[0]
に設定し,ナル文字でない限り処理を繰り返すようにしています。それが出力結果の最初の4行となります。2つ目の for
文では「ポインタのポインタ」z
をポインタ x[0]
のアドレス x == &x[0]
に設定し,ポインタの配列 x[i]
において NULLポインタでない限り処理を繰り返すものです。それが残りの出力結果となります。