構造体は,様々な要素から構成されるものを1つのユニットにし,理解しやくされた工夫です。そこで,ユニットを幾つも作り,それらのユニットからなるユニットも考えられます。それが「構造体の構造体」です。
例えば,文献リストの場合,分野別に分けて作成する方法が考えられます。分野の名称を付してリストを作成するのであれば,文献リストは次の変数を持つことになります。
char class[32]; /* 分野 (classification) */ struct ref paper[100]; /* この分野の論文リスト */
これら2つの要素をもつユニットも作成できる訳です。
/* Example 11.9 */ #include <stdio.h> #include <string.h> struct ref { char author[40]; /* 著者 */ char title[80]; /* タイトル */ int year; /* 発行年 */ char resource[120]; /* 出典元 */ }; struct list { char class[32]; /* 分野 31字以内 */ struct ref paper[100]; } list; int main(void) { memcpy(list.class, "Game Theory", sizeof(list.class)-1); memcpy(list.paper[0].author, "J. von Neumann", sizeof(list.paper[0].author)-1); memcpy(list.paper[0].title, "Zur Theorie der Gesellschaftsspiele", sizeof(list.paper[0].title)-1); memcpy(list.paper[0].resource, "Mathematische Annalen", sizeof(list.paper[0].resource)-1); list.paper[0].year = 1928; printf("[AU] %s\n", list.paper[0].author); printf("[TI] %s\n", list.paper[0].title); printf("[YR] %d\n", list.paper[0].year); printf("[SO] %s\n", list.paper[0].resource); printf("[FI] %s\n", list.class); return 0; }
構造体 list
が char
型配列 class
と構造体ref
型配列 paper
から構成され,構造体list
型オブジェクト list
が文献リスト全体を意味することとなります。
/* Example 11.10 */ #include <stdio.h> struct s { char c; char str[12]; }; struct st { int n; struct s x; } y[20] = { {1, {'a', "first"}}, {2, {'b', "second"}}, {3, {'c', "third"}} }; int main(void) { int i; for (i = 0; y[i].n != 0; i++) printf("y[%d] %d %c %s\n", i, y[i].n, y[i].x.c, y[i].x.str); return 0; }
Example 11.10
の実行結果です。
y[0] 1 a first y[1] 2 b second y[2] 3 c third