サイトマップ / C言語講座出入り口総目次目次:ポインタ>ポインタの配列(1)

青い直線

ポインタの配列(1)

青い直線

[ポインタと配列]←このソース→[ポインタの配列(2)]

/* 前回は、ポインタと配列について学びました。今回は、ポインタの配列について学びます。

ポインタの配列

前回は、複数の文字列を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"の2番目の要素を指します。
wday[1]++とすると、
wday[1]は"Monday の2番目の要素を指します。

以下、同様です。

ソースプログラムの説明

今回のソースプログラムのメイン関数の中で、ポインタの配列の中の最初のポインタの指す中身が、'\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言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>ポインタの配列(1)