網絡学習管理 速習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(d) Scope and Storage classC exercises(d) Scope and Storage class

変数の通用範囲 自動変数のことを局所変数、外部変数のことをグローバル変数(大域変数)ともいいます。 変数のスコープの範囲を図で表してみます。 赤色で囲った部分がグローバル変数の有効範囲です。 青色で囲った部分がローカル変数の有効範囲です。 この図ではローカル変数の寿命を関数内と説明しましたが、正確にはブロック内です。 ブロックとは、{}で囲まれている範囲のことを指しています。 記憶クラス Cで扱う記憶領域は一般に、プログラム領域、静的領域、スタック領域、ヒープ領域の 4つに大別されます。 記憶クラスには、4つあり、自動、静的、外部、レジスタがあります。 記憶クラス 記憶領域 スコープ 記憶クラス指定子 自動変数 スタック { } の内側 […]

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(5) AddressC exercises(5) Address

ポインタの仕組み:アドレスとは ポインタはC言語(および拡張言語)に特有の概念で、C言語を学び始めた初心者が必ずといっていいほどつまづく概念でもあります。ポインタがどうしても理解できないためにC言語に挫折してしまう方もいます。 アドレスの基本 コンピュータの記憶装置(メモリ)には、アドレスが付けられている。 変数のアドレス 変数のアドレスを取得するには変数名の前にアンパサンド “&”をつけます。 int a = 123; printf(“aのアドレス : %p\n”, &a); 配列のアドレス 配列の先頭をアドレスは、配列名だけで示します。要素のアドレスは&配列名[添字]で示します。 #include <stdio.h> int […]