本文へスキップ
BecomeCoder

C言語コース · 第7章 構造体と共用体 · レッスン27

struct基本 ― データをひとまとめにする型

ブラウザで完結

導入

「名前」「年齢」を別々の変数 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 20Hanako 18 です。構造体の変数 p は、メモリ上で name 用の領域と age 用の領域が並んで確保された、ひとつの箱になっています。

flowchart LR
  subgraph P["struct Person p"]
    direction LR
    n["name(20バイト)<br/>&quot;Taro&quot;"]
    a["age(4バイト)<br/>20"]
  end

p.age = 20; のように . の右にメンバ名を書くと、その箱だけを読み書きできます。構造体そのものは「複数の箱をまとめて名前を付けたもの」というだけで、使い方は普通の変数とほとんど同じです。

やってみよう

下のエディタで実行して出力を確かめましょう。p.age の値を書き換えたり、q の初期化子を自分の名前・年齢に変えたりして、結果がどう変わるか確かめてください。

演習

struct Person に身長を表すメンバ double height; を追加してください。そのうえで name = "Jiro"age = 25height = 170.5 の値を持つ変数を作り、printf("%s %d %.1f\n", ...) で1行「Jiro 25 170.5」と表示してください。

ヒント1を見る

構造体の定義に double height; を1行追加します。

ヒント2を見る

初期化は struct Person p = {"Jiro", 25, 170.5}; のようにまとめて書くのが簡単です。

実際に動かしてみよう

下のエディタにCを書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のCコンパイラ(clang + dlmalloc)がその場でコンパイルして実行し、出力が表示されます。構造体・共用体・malloc/free・関数ポインタ・ファイル入出力などがそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(scanf)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。