導入
「名前」「年齢」を別々の変数 char name[20]; と int age; で持っていると、人が増えるたびに変数が倍々に増え、関数に渡すときの引数も増えていきます。C言語の struct(構造体)を使うと、複数のデータを「ひとつの型」としてまとめて扱えます。
説明
構造体は struct タグ名 { 型 メンバ; ... }; の形で定義します。変数を作るときは struct タグ名 変数名; と書きます(C言語では struct を省略できません。この点はC++と違います)。メンバへのアクセスは .(ドット)です。
#include <stdio.h>
#include <string.h>
struct Person {
char name[20];
int age;
};
int main(void) {
struct Person p;
strcpy(p.name, "Taro");
p.age = 20;
printf("%s %d\n", p.name, p.age);
struct Person q = {"Hanako", 18}; // { } でまとめて初期化もできる
printf("%s %d\n", q.name, q.age);
return 0;
}
出力は Taro 20 と Hanako 18 です。構造体の変数 p は、メモリ上で name 用の領域と age 用の領域が並んで確保された、ひとつの箱になっています。
flowchart LR
subgraph P["struct Person p"]
direction LR
n["name(20バイト)<br/>"Taro""]
a["age(4バイト)<br/>20"]
end
p.age = 20; のように . の右にメンバ名を書くと、その箱だけを読み書きできます。構造体そのものは「複数の箱をまとめて名前を付けたもの」というだけで、使い方は普通の変数とほとんど同じです。
やってみよう
下のエディタで実行して出力を確かめましょう。p.age の値を書き換えたり、q の初期化子を自分の名前・年齢に変えたりして、結果がどう変わるか確かめてください。
演習
struct Person に身長を表すメンバ double height; を追加してください。そのうえで name = "Jiro"、age = 25、height = 170.5 の値を持つ変数を作り、printf("%s %d %.1f\n", ...) で1行「Jiro 25 170.5」と表示してください。
ヒント1を見る
構造体の定義に double height; を1行追加します。
ヒント2を見る
初期化は struct Person p = {"Jiro", 25, 170.5}; のようにまとめて書くのが簡単です。