構造体の初期化
配列と同じように、構造体の変数も初期化子を用いて宣言と同時に初期化できます。初期化の方法も配列と同じで、初期化子並びの先頭から順に、構造体のメンバに割り当てられます。初期化子並びに指定された値の数がメンバの数よりも少なければ、残りのメンバは0で初期化されます。
Sample03
#include <stdio.h>
int main(void)
{
struct { int x, y; } pt = { 10, 20 };
printf("x=%d, y=%d\n", pt.x, pt.y);
return 0;
}
実行結果
Sample03の実行結果 |
Sample03はint型のメンバ x と y を持つ構造体型の変数ptを、宣言と同時に初期化しています。初期化子並びには10と20の2つの値を指定します。これらの値は、構造体の宣言でメンバが出現した順に割り当てられるため、最初の値10は x メンバに、次の20は y メンバに保存されます。実行結果を見れば、初期化子並びに指定した値で、メンバが正しく初期化されていることが確認できます。
配列のメンバ
構造体のメンバには、任意の型を指定することができます。よって、何らかの配列型のメンバを持つことも可能です。文字列を含む構造体や、大きなデータ配列を持つ構造体に適用できます。配列型のメンバを持つ構造体を初期化するには、多次元配列の初期化と同じように、初期化子並びを表す波括弧 { } を入れ子にします。配列型メンバに該当する初期化子に初期化子並び { } を指定することで、構造体内の配列型のメンバを初期化できます。
Sample04
#include <stdio.h>
int main(void)
{
int i;
struct {
int ary1[5];
int ary2[3];
int ary3[6];
} obj = {
{ 1, 2, 3, 4, 5 },
{ 10, 20, 30 },
{ 100, 200, 300, 400 }
};
printf("ary1 ");
for(i = 0 ; i < 5 ; i++) printf("%d, ", obj.ary1[i]);
printf("\nary2 ");
for(i = 0 ; i < 3 ; i++) printf("%d, ", obj.ary2[i]);
printf("\nary3 ");
for(i = 0 ; i < 6 ; i++) printf("%d, ", obj.ary3[i]);
printf("\n");
return 0;
}
実行結果
Sample04の実行結果 |
Sample04のobj変数は、それぞれが異なる要素数のint型の配列ary1、ary2、ary3 メンバを持つ構造体です。この変数を初期化するために、構造体を初期化する初期化子の中に、配列を初期化する初期化子並びを指定しています。