ポインタの配列
複数の文字列をchar型の2次元配列で宣言しました。それを下記に示します。
char kw[3][7] = {"double", "extern", "switch"};
同様なものをポインタを使って宣言すると、下記のようにポインタの配列となります。
const static char *wday[ ] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
NULL
};
[ ]の中には8が入るのですが、コンパイラが数えてくれるので省略しています。
- wday[0]は最初は”Sunday”の先頭アドレスを指します。
- wday[1]は最初は”Monday”の先頭アドレスを指します。
- wday[0]++とすると、
- wday[0]は”Sunday”の1番目の要素を指します。
- wday[1]++とすると、
- wday[1]は”Monday の2番目の要素を指します。
以下、同様です。
配列の最後の要素は、’NULL’です。このようにしてあるのは、ポインタの配列が幾つあるか計るためです。
‘NULL’を使わない場合は、ポインタの配列の数を保持している変数が必要になります。
#include <stdio.h>
/* ポインタwday[ ]の指している文字列の配列は、
const:書き変え禁止で
static:他のファイルから参照禁止 */
const static char *wday[ ] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
NULL
};
void MyPrint(const char **p); /* 引数はポインタを指すポインタ */
void main(void);
void MyPrint(const char **p)
{
while (*p) { /* pの指すポインタがNULLでない間 */
printf("%s\n", *p); /* pの指す中身を表示 */
p++;
}
printf("\n");
}
void main(void)
{
const char **p; /* ポインタを指すポインタ */
p = wday; /* ポインタの配列の先頭を指すようにする */
MyPrint(p);
while (*wday[0] != '\0' ) /* 指す中身がNULLでない間 */
printf("%c ", *wday[0]++ ); /* 表示する */
printf("\n");
}
出力結果
Sunday Monday Tuesday Wednesday Thursday Friday Saturday S u n d a y
演習
A7-4-2 (P253)
疑似乱数を発生させ、「誰がいつとこで何をした」と表示してください。
(Who) が (When) (Where) で (What) をした。
ヒント
printf("%s が %s %s で %s をした",
pwho[rand() % 3],
pwhen[rand() % 3],
pwhere[rand() % 2],
pwhat[rand() % 2]
);
出力結果
田中が夜家で勉強をした。