網絡学習管理 速習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(6) Pointers and VariablesC exercises(6) Pointers and Variables

ポインタの仕組み:ポインタで変数を指す ポインタとは ポインタ (pointer)とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照するものである。有名な例としてはC/C++でのメモリアドレスを表すポインタが挙げられる。(ja.wikipedia.org) ポインタ=メモリアドレス 間接演算子 * と アドレス演算子 & ポインタの使用手順 宣言 アドレスの設定 使用 ポインタで変数 間接演算子を使って、ポインタが指すメモリの値を取得することを間接参照するといいます。 間接演算子を用いれば、アドレスを間接参照するだけではなく、ポインタが表すアドレスに値を間接代入することもできます。 #include <stdio.h> int main() { […]

C exercises(d) Scope and Storage classC exercises(d) Scope and Storage class

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

C exercises (1) guidanceC exercises (1) guidance

C言語プログラミングⅡの試験解説 #2015年度解答付後期C言語2プロ試験問題 C言語検定試験について 主催・認定 サーティファイ情報処理能力認定委員会 試験名 C言語プログラミング能力認定試験 (C-Language Programming Skills Qualification Test) 試験目的 C言語を駆使して応用プログラム(言語処理系、ユーティリティなど)を作成する能力を認定します。 認定基準 一級 C言語を駆使し、応用プログラム(言語処理系、ユーティリティなど)が作成できる能力を有する。 また使用しているOSについて理解をしている。 二級 小規模のプログラム(500行程度)が適切に(理路整然、簡潔、正しく、速く)書ける。 […]