文献リストの例に戻りましょう。文献リストは,通常,幾つもの文献が連なることでリストとなります。これを構造体を用いずに作成する場合,
char author[100][60]; /* 著者 */ char title[100][80]; /* タイトル */ int year[100]; /* 発行年 */ char resource[100][120]; /* 出典元 */
とすることで,100件の文献からなる文献リストとなります。構造体が便利なところは,このような宣言をせずとも,構造体の中身を変えずに,オブジェクトを配列にすることで,リストを作成できることです。
/* Example 11.7 */
#include <stdio.h>
#include <string.h>
struct ref {
       char author[40];        /* 著者 */
       char title[80];         /* タイトル */
       int  year;              /* 発行年 */
       char resource[120];     /* 出典元 */
} paper[100], book[100];
int main(void)
{
       memcpy(paper[0].author,
              "J. von Neumann", sizeof(paper[0].author)-1);
       memcpy(paper[0].title,
              "Zur Theorie der Gesellschaftsspiele", sizeof(paper[0].title)-1);
       paper[0].year = 1928;
       memcpy(paper[0].resource,
              "Mathematische Annalen", sizeof(paper[0].resource)-1);
       printf("[AU] %s\n", paper[0].author);
       printf("[TI] %s\n", paper[0].title);
       printf("[YR] %d\n", paper[0].year);
       printf("[SO] %s\n", paper[0].resource);
       return 0;
}
構造体 ref 自体に変化はありません。1つの文献に対し,それを構成する要素のみを指定しているのみです。その代わり,100件の文献が扱えるように,構造体の宣言において配列を指定しています。それが論文リスト paper[100] や本のリスト book[100] な訳です。構造体配列の個別要素は paper[i] であり,それがもつメンバは paper[i].author と言った具合になります。実行結果は次の通りです。
[AU] J. von Neumann [TI] Zur Theorie der Gesellschaftsspiele [YR] 1928 [SO] Mathematische Annalen
/* Example 11.8 */
#include <stdio.h>
struct s {
       int n;
       char str[12];
} x[100] = {
       {1, "first"},
       {2, "second"},
       {3, "third"}
};
int main(void)
{
       int i;
       for (i = 0; x[i].n != 0; i++)
              printf("x[%d] %d\t%s\n", i, x[i].n, x[i].str);
       return 0;
}
実行結果です。(丸括弧内はその文字の ASCIIコード番号です。)
x[0] 1 first x[1] 2 second x[2] 3 third
配列の初期化ルールを利用して,x[i].n が 0 のところで繰り返しから抜けるようにしています。