構造体型オブジェクトを作成するには,型指定子
struct タグ {struct-宣言} struct タグ
のいずれかを使用します。struct-宣言
には,構造体タグ
型がもつ「メンバ」のリストを指定します。例えば,文献リストの場合,次のように宣言すれば,
/* Example 11.1 */ struct ref { char author[40]; /* 著者 */ char title[80]; /* タイトル */ int year; /* 発行年 */ char resource[120]; /* 出典元 */ };
構造体ref
型が char
の配列 author
,title
,resource
,そして int
型変数 year
を「メンバ」に持つ「文献」(reference)を意味します。
* タグ,或いは列挙体メンバを含む場合は,宣言子はオプションである。このため,上の宣言は文法上間違いではない。
しかしながら,上の場合,型指定子のみの宣言で宣言子がないため,オブジェクト(変数)は未だありません。オブジェクトを意味する識別子の導入が必要です。例えば,
/* Example 11.2 */ struct ref { char author[40]; /* 著者 */ char title[80]; /* タイトル */ int year; /* 発行年 */ char resource[120]; /* 出典元 */ }; struct ref paper, book;
とすれば,識別子 paper
や book
は構造体ref
型オブジェクトであり,paper
がある「論文」,book
がある「本」だとすれば,それらは著者(author
),タイトル(title
),発行年(year
),そして出版元(resource
)をメンバに持ちます。
宣言の文法に従えば,構造体ref
型とオブジェクトを同時に指定することもできます。
/* Example 11.3 */ struct ref { char author[40]; /* 著者 */ char title[80]; /* タイトル */ int year; /* 発行年 */ char resource[120]; /* 出典元 */ } paper, book;
Example 11.2
と同じ意味になります。
構造体型は集成体型(集合体型)であるため,初期化は配列と同じように波括弧 { }
の初期化子を使います。メンバの個数より少なく指定すると,残りは各メンバの型に合わせ 0
がメモリに記憶されます。[C99, 6.7.8, 21]
/* Example 11.4 */ struct ref { char author[40]; /* 著者 */ char title[80]; /* タイトル */ int year; /* 発行年 */ char resource[120]; /* 出典元 */ } paper = { "J. von Neumann", "Zur Theorie der Gesellschaftsspiele", 1928, "Mathematische Annalen" }; struct ref book = { "J. von Neumann and O. Morgenstern", "Theory of Games and Economic Behavior", 1944, "Princeton University Press" };