構造体型オブジェクトを作成するには,型指定子
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"
};