構造体とは
例えば、30人のクラスのテストの点数を扱う時のことを考えてみましょう。名前のための変数”name”、数学のための変数”math”、英語のための変数”english”を用意して各々にデータを入力していくとします。このとき、名前の表には「”田中太郎”,”山田花子”,…」といったように名前のデータだけ、数学の表には「”60”,”80”,…」と数学の点数のデータだけが格納されているとしたらとても分かりにくいですよね?
普通、こういう時は「”田中太郎”について”数学”,”英語”のデータ」、「”山田花子”について”数学”,”英語”のデータ」と一人ひとりデータを分けて扱います。
このように複数のデータを一つのまとまりとして扱う時に使用されるのが構造体です。
では、「『九州』にある県の『県名』と『人口』、『面積』を構造体としてひとまとめにし、それらを表示するプログラム」を作ってみましょう。
#include<stdio.h>
#include<string.h>
#define MAX 64
struct kyushu {
char prefecture[MAX]; //県名
int population; //人口
double square; //面積
};
int main(void)
{
struct kyushu fukuoka;
strcpy(fukuoka.prefecture, "Fukuoka");
fukuoka.population = 511;
fukuoka.square = 4986.52;
printf("県名 : %s\n", fukuoka.prefecture);
printf("人口 : %d 万人\n", fukuoka.population);
printf("面積 : %.2f 平方キロメートル\n", fukuoka.square);
return 0;
}
人口 : 511
面積 : 4986.52
解説
構造体は以下のように宣言します。
struct 構造体タグ {
型名 メンバ
};
上記のソースコードでは、
構造体タグが「kyushu」でメンバが「”prefecture”,”population”,”square”」となります。
構造体を宣言した時、記憶域上には各メンバが宣言順に並びます。
そして、これら個々のデータをひとつのオブジェクトに格納するための宣言が上記のプログラムの以下の部分となります。
struct kyushu fukuoka;
構造体の個々のデータにアクセスするとき
オブジェクト.メンバ
と記述することでそのオブジェクトに関しての個々のデータを扱うことができます。
例えばオブジェクト”fukuoka”の人口”population”にアクセスする時、”fukuoka.population”と記述して取り扱います。
オブジェクト”fukuoka”について図で示したものが以下になります。

上のプログラムでは構造体の型の変数の宣言を行ったのちに、数値の代入を行っていますが、宣言した時に初期化を行うことで簡略化することができます。

また、構造体の宣言時にtypedef宣言といって
typedef struct 構造体タグ {
型名 メンバ
} typedef名;
とすることで構造体の型の変数を宣言する際に
typedef名 変数名
とすれば良くなるため、記述が簡潔化します。
これらを利用して、上記のプログラムを書き換えたものが以下のプログラムです。
#include<stdio.h>
#define MAX 64
typedef struct kyushu {
char prefecture[MAX]; //県名
int population; //人口
double square; //面積
} Kyushu;
int main(void)
{
Kyushu fukuoka = {"Fukuoka", 511, 4986.52};
printf("県名 : %s\n", fukuoka.prefecture);
printf("人口 : %d 万人\n", fukuoka.population);
printf("面積 : %.2f 平方キロメートル\n", fukuoka.square);
return 0;
}

構造体の型の変数には配列も使用できます。これでその悩みは解決できますね。
#include<stdio.h>
#define MAX 64
#define MEMBER 3
typedef struct kyushu {
char prefecture[MAX]; //県名
int population; //人口
double square; //面積
} Kyushu;
int main(void)
{
Kyushu mem[] = {
{"Fukuoka", 511, 4986.52},
{"Kumamoto", 175, 7409.48},
{"Oita", 113, 6340.73},
};
for(int i=0;i<MEMBER;i++){
printf("県名 : %s\n", mem[i].prefecture);
printf("人口 : %d 万人\n", mem[i].population);
printf("面積 : %.2f 平方キロメートル\n", mem[i].square);
if(i != MEMBER-1)
puts("");
}
return 0;
}
人口 : 511 万人
面積 : 4986.52 平方キロメートル
県名 : Kumamoto
人口 : 175 万人
面積 : 7409.48 平方キロメートル
県名 : Oita
人口 : 113 万人
面積 : 6340.73 平方キロメートル
C言語学習におすすめのテキストはこちら