法大奥山研究室

 previous  contents

11.1. 構造体型オブジェクト


 構造体型オブジェクトを作成するには,型指定子

struct タグ {struct-宣言}
struct タグ

のいずれかを使用します。struct-宣言 には,構造体タグ 型がもつ「メンバ」のリストを指定します。例えば,文献リストの場合,次のように宣言すれば,

/* Example 11.1 */

struct ref {
       char author[40];        /* 著者 */
       char title[80];         /* タイトル */
       int  year;              /* 発行年 */
       char resource[120];     /* 出典元 */
};

構造体ref型が charの配列 authortitleresource,そして int型変数 year を「メンバ」に持つ「文献」(reference)を意味します。

* タグ,或いは列挙体メンバを含む場合は,宣言子はオプションである。このため,上の宣言は文法上間違いではない。

 しかしながら,上の場合,型指定子のみの宣言で宣言子がないため,オブジェクト(変数)は未だありません。オブジェクトを意味する識別子の導入が必要です。例えば,

/* Example 11.2 */

struct ref {
       char author[40];        /* 著者 */
       char title[80];         /* タイトル */
       int  year;              /* 発行年 */
       char resource[120];     /* 出典元 */
};

struct ref paper, book;

とすれば,識別子 paperbook は構造体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"
};

 previous  contents