Previous: 構造体 III
Up: 構造体 III
Next: 関数と構造体
Previous Page: 構造体 III
Next Page: 関数と構造体
前に学習したように構造体の初期化は、以下のように行う。
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 標準規格にもそうした拡張について記されているので、今後は徐々に配列も常に 初期化出来るようになっていくであろう。とは言え、諸君は、この拡張が常に使える とは限らないので、それに頼ってはならない。