ポインタの配列
複数の文字列を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] );
出力結果
田中が夜家で勉強をした。