Previous: 構造体 III
Up: 構造体 III
Next: 関数と構造体
Previous Page: 構造体 III
Next Page: 関数と構造体

構造体の初期化 II

前に学習したように構造体の初期化は、以下のように行う。

struct タグ名 変数名 = { 値, 値, ...};

例1
        struct point {
                int x;
                int y;
        };
        struct point a = { 2, 3};

構造体変数の初期化は、変数の宣言時には常に行うことが出来る点に注意しよう。

では、構造体が構造体を含む場合の初期化は、本当はどうすれば良いのだろうか? 次の例を見てみよう。

例2
        struct point {
                int x, y;
        };
        struct triangle {
            struct point t1, t2, t3;
        }
        struct triangle a = { 0,0, 1,1, 2,2 };

struct triangle 型の構造体変数 a は、 struct point 型の 構造体メンバー t1, t2, t3 を含み、 struct point 型は整数の メンバー x, y を含むので、結局構造体変数 a は、6個の整数を含んで いる事が分かる。従って、この例2の最後の行のように、6個の整数で初期化する 事も出来る。しかし、この例は少し分かりにくいし、 struct triangle 型が 3つのメンバーを持っている事が、この初期化では見えない。実際に、 struct point 型の変数の初期化は次のように行うことを学んだ。

strcut point z = { 1, 2};

従って、 struct triangle 型の変数を初期化する時は、上の初期化を3個行う と考えた方が自然であろう。即ち、正式な初期化は次のようにする。

例3
        struct triangle a = { {0,0}, {1,1}, {2,2} };

この方法だと、 struct triangle 型の変数 a の3つのメンバーを、 {0,0} と {1,1} と {2,2} で初期化しているのが良く分かる。

 

次に構造体の配列の初期化であるが、これも構造体の中の構造体の初期化と同じように 考えて良い。

例4
        struct point z[2] = { {3,2}, {4,1} };

更に複雑にしても同じ考え方をする。

例5
        struct triangle a[3] = {
                    { {0,0}, {1,1}, {2,2} },
                    { {2,1}, {3,1}, {4,2} },
                    { {0,0}, {1,2}, {1,2} }
        };

例5では、1個の配列 ( 例えば a[0] ) は、例3と同じように初期化出来る と考えれば、大きさ3の配列なので、それを3個行えば良いことは明らかであろう。

 

注意  例5はあくまでも配列なので、この初期化は常に行えるとは限らない。 何故ならば、配列の初期化は、通常は外部又は静的な場合にのみ行えるからである。 但し、処理系によっては、一般に配列の初期化を許しているものもあり、 ANSI 標準規格にもそうした拡張について記されているので、今後は徐々に配列も常に 初期化出来るようになっていくであろう。とは言え、諸君は、この拡張が常に使える とは限らないので、それに頼ってはならない。

maruyama@wakhok.ac.jp
1995年02月08日 (水) 18時57分57秒 JST