サイトマップ / C言語講座>出入り口>総目次>目次:ポインタ>ポインタの配列(1)
[ポインタと配列]←このソース→[ポインタの配列(2)]
/* 前回は、ポインタと配列について学びました。今回は、ポインタの配列について学びます。
前回は、複数の文字列をchar型の2次元配列で宣言しました。それを下記に示します。
char kw[3][7] = {"double", "extern", "switch"};
同様なものをポインタを使って宣言すると、下記のようにポインタの配列となります。
const static char *wday[ ] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", NULL };
[ ]の中には8が入るのですが、コンパイラが数えてくれるので省略しています。
以下、同様です。
今回のソースプログラムのメイン関数の中で、ポインタの配列の中の最初のポインタの指す中身が、'\0'でなければ表示して指すアドレスを1進めています。
while (*wday[0] != '\0') printf("%c ", *wday[0]++); printf("\n");
%cの後にスペースがあるので、"Sunday"は不連続に表示されます。
もっとスマートにポインタの指す中身を表示しているのは、関数 MyPrint( )です。引数として、char **pを取ります。
ポインタ配列の先頭アドレスを渡すには、ポインタのポインタを使います。
char *wday[ ]は記憶クラスがstaticと宣言されているので、他のファイルからは参照できません。constという修飾子が付いているので、何かの関数がこれを書き変えようとすると、コンパイルエラーになります。
ポインタの配列の指している文字列の配列は、メモリ上に連続して取られます。それぞれの文字列の先頭アドレスが、ポインタの配列に入ります。従って、ポインタの配列で、文字列の中身を見ることができます。
配列の最後の要素は、'NULL'です。このようにしてあるのは、MyPrint( )はポインタの配列が幾つあるか知らないからです。
'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"); } |
[ポインタと配列]←このソース→[ポインタの配列(2)]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−