プログラミング

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;
}

namescoreのような構造体の中の変数をメンバと呼びます。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は決まった選択肢へ名前を付ける

前の回 / 次の回:成績管理プログラム

← 記事一覧へ戻る