サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−