構造体変数を配列として考えることを構造体配列と呼びます。
#include <stdio.h> int main(void) { //構造体配列の宣言(構造体テンプレートと、構造体配列を別々に書く場合) struct data{ int no; char name[10]; int age; }; struct data list1[10]; //構造体配列の宣言(構造体テンプレートと、構造体配列を同時に書く場合) struct data2{ int no; char name[10]; int age; } list1[10]; //構造体配列を初期化する場合(各々の配列内に値をセットしている) struct data2 list1[10] = { {1, "testA", 10}, {2, "testB", 20}, {3, "testC", 32}, {4, "testD", 41} }; //↑の例では、list1[10]と定義しているので、10個分の構造体配列を持たせることができる return 0; }
上記プログラムを実行しただけでは、画面上にはなにもおこりません。
そこで、構造体配列の中身を参照する記述を書いてみます。
#include <stdio.h> int main(void) { //構造体配列の宣言(構造体テンプレートと、構造体配列を別々に書く場合) struct data{ int no; char name[10]; int age; }; struct data list1[10]; //構造体配列の宣言 //構造体配列の宣言(構造体テンプレートと、構造体配列を同時に書く場合) struct data2{ int no; char name[10]; int age; } list1[10]; //構造体配列の宣言(同時に) //構造体配列を初期化する場合(各々の配列内に値をセットしている) struct data2 list1[10] = { {1, "testA", 10}, {2, "testB", 20}, {3, "testC", 32}, {4, "testD", 41} }; //↑の例では、list1[10]と定義しているので、10個分の構造体配列を持たせることができる //構造体配列の中身を参照する記述 //方法1 int i; for (i = 0; i <10; i++ ) { printf("%d %s %d \n", list1[i].no, list1[i].name, list1[i].age); } printf("-----------\n"); //方法2 int j; struct data2 *sp = list1; for (j = 0; j < 10; j++ ) { printf("%d %s %d \n", list1[*(sp+j)].no, list1[*(sp+j)].name, list1[*(sp+j)].age); } printf("-----------\n"); //方法3 struct data2 *sp; for (sp = list1; sp != list1 + 10; sp++ ) { printf("%d %s %d \n", sp->no, sp->name, sp->age); } return 0; }
上記を実行した結果、方法2の結果がなぜか下記のようになる。
1 testA 10 2 testB 20 3 testC 32 4 testD 41 0 0 0 0 0 0 0 0 0 0 0 0 ----------- 2 testB 20 //出力の開始がおかしい(2つめからになっている) 3 testC 32 4 testD 41 0 0 //←ここの値がおかしい 1 testA 10 1 testA 10 1 testA 10 1 testA 10 1 testA 10 1 testA 10 ----------- 1 testA 10 2 testB 20 3 testC 32 4 testD 41 0 0 0 0 0 0 0 0 0 0 0 0
なぜなのか、、調査中