網絡学習管理 速習C言語入門3 C exercises(7) Pointer Arrays

C exercises(7) Pointer Arrays

ポインタの配列

複数の文字列を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]
  );

出力結果

田中が夜家で勉強をした。

 

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


Related Post

C exercises(9) Basics of FunctionC exercises(9) Basics of Function

関数の基本 C言語において関数を使うことには、以下のような利点があります。 関数化しておくとそれを1つのブラックボックスとして扱うことができます。 つまり、使用する側が知っておくべきことは、以下の通りです。 入力として、どのような引数を与えるか 出力として、関数がどんな値を返すのか 関数を使ったことによって、どんな副作用があるか 一度、関数として作成しておけば、後で何度でも再利用することができる 関数として各機能をまとめていくと、一般にプログラムが見やすく、デバッグの作業もしやすい 関数の呼び出し #include <stdio.h> void func();   //関数のプロトタイプ宣言 int main() { func();    //関数呼び出し printf(" ここがメイン関数内\n"); return 0; } void func()    //自作関数 { […]

C exercises (3) string and ctypeC exercises (3) string and ctype

標準ライブラリ関数 : 文字列操作関数 string.hのヘッダファイルをincludeする 主なもの: strcpy(ss,st):文字列(文字型の配列)ssに文字列stをコピーする strlen(st):文字列stの長さを求める strcat(ss,st):文字列ssの後ろに文字列stを連結する strncpy(ss,st,n):文字列ssに文字列stの先頭n文字をコピーする strncat(ss,st,n)文字列ssの後ろに文字列stの先頭n文字を連結する サンプル: #include <stdio.h> #include <string.h> //string.hのインクルードを忘れずに int main(int argc, const […]

C exercises(8) Pointer SummaryC exercises(8) Pointer Summary

ポインタのまとめ アドレス ポインタと使用手順 ポインタ配列 過去のページを参照 演習 ポインタを使ったプログラムをグループで作成する。 7-3-4-3(P245) 大きさ10の整数型配列を用意し、下図のように初期設定しなさい。 この配列を順に調べ、奇数の値のみ、別の大きさ10の整数型配列に代入しなさい。 また、配列の中身と、何個格納したかを画面表示しなさい。 実行結果 15 45 9 71 37 格納個数 = 5 […]