C言語超入門⑧ 構造体と列挙型を使おう
struct、typedef、ポインタからのアクセス、enumを使い、関連するデータを分かりやすくまとめます。
第8回では、名前や点数など、種類の違うデータをひとまとめにする構造体を学びます。
この回でできるようになること
- structで新しいデータの形を作る
- ドット演算子で中の値を使う
- 構造体のポインタを扱う
- enumで選択肢に名前を付ける
構造体を作る
生徒の名前と点数を別々の変数にすると、人数が増えたときに関係を追いにくくなります。構造体なら、関連する値を1つにまとめられます。
#include <stdio.h>
typedef struct {
char name[50];
int score;
} Student;
int main(void) {
Student student = {"Aoi", 85};
printf("%s: %d点\n", student.name, student.score);
return 0;
}
nameとscoreのような構造体の中の変数をメンバと呼びます。student.nameのようにドットでつなげてアクセスします。
typedefは、型へ分かりやすい別名を付ける仕組みです。この例では、作った構造体をStudentという型名で使えるようにしています。
値を後から変更する
Student student = {"Aoi", 85};
student.score = 90;
通常の変数と同じように代入できます。
構造体の配列
同じ種類のデータが複数あるときは、構造体の配列が便利です。
Student students[3] = {
{"Aoi", 85},
{"Ren", 72},
{"Mio", 91}
};
for (int i = 0; i < 3; i++) {
printf("%s: %d点\n", students[i].name, students[i].score);
}
ポインタからメンバを使う
構造体を指すポインタでは、->を使ってメンバへアクセスできます。
void addBonus(Student *student) {
student->score += 5;
}
student->scoreは(*student).scoreと同じ意味ですが、矢印の方が読みやすく書けます。
enumで選択肢に名前を付ける
状態やメニューなど、決まった選択肢には列挙型を使えます。
typedef enum {
STATE_IDLE,
STATE_RUNNING,
STATE_PAUSED
} GameState;
GameState state = STATE_RUNNING;
if (state == STATE_RUNNING) {
printf("ゲームを実行中です\n");
}
0や1をそのまま書くよりも、それぞれの意味が伝わりやすくなります。
練習してみよう
商品名、価格、在庫数を持つProduct構造体を作り、2つの商品を表示してみましょう。
模範解答
#include <stdio.h>
typedef struct {
char name[50];
int price;
int stock;
} Product;
int main(void) {
Product products[2] = {
{"キーボード", 4800, 6},
{"マウス", 2500, 10}
};
for (int i = 0; i < 2; i++) {
printf("%s: %d円、在庫%d個\n",
products[i].name,
products[i].price,
products[i].stock);
}
return 0;
}
解説
Product構造体へ種類の違う3つの値をまとめ、そのProductを2個持つ配列を作っています。for文で商品を1つずつ取り出し、ドット演算子で各メンバを表示します。
この回のまとめ
- 構造体は種類の違う関連データをまとめられる
- メンバへはドットでアクセスする
- 構造体のポインタでは矢印を使える
- enumは決まった選択肢へ名前を付ける