法大奥山研究室

 previous  contents

10.10. ポインタの配列: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;

ポインタへのポインタ zx + 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ポインタでない限り処理を繰り返すものです。それが残りの出力結果となります。


 previous  contents