構造体変数を配列として考えることを構造体配列と呼びます。
#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
なぜなのか、、調査中