本文へスキップ
BecomeCoder

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

typedef ― 構造体に別名をつける

ブラウザで完結

導入

struct Point p; のように、変数を作るたびに struct を書くのは面倒です。C言語には、型に別名をつける typedef があり、これを使うと struct を省略して Point p; と書けるようになります。

説明

typedef struct { ... } 別名; の形で、構造体の定義と同時に別名をつけるのが定番の書き方です。

#include <stdio.h>

typedef struct {
    int x;
    int y;
} Point;

int main(void) {
    Point p = {3, 4};        // struct を書かなくてよい
    printf("(%d,%d)\n", p.x, p.y);
    return 0;
}
flowchart LR
  a["struct Point p;<br/>(typedefなし)"] -.->|"typedefで別名をつける"| b["Point p;<br/>(毎回structを書かなくていい)"]

すでに struct タグ名 が別にある場合は、typedef struct タグ名 別名; の形で後から別名をつけることもできます。この形は、次の第8章で自分自身を指すポインタを持つ構造体(連結リスト)を作るときにも使います。

struct Node {
    int value;
    struct Node *next;
};
typedef struct Node Node;   // struct Node に Node という別名をつける

やってみよう

Point を使って、別の座標の値を持つ変数をもう1つ作って表示してみましょう。typedef を外して struct Point に戻すとどうなるかも確かめてください(コンパイルエラーになります)。

演習

typedef struct { double radius; Point center; } Circle; のように、Point をメンバに持つ Circletypedef で定義してください。center = {0, 0}radius = 5.0 の値を持つ変数を作り、printf("radius=%.1f\n", c.radius); で「radius=5.0」と表示してください。

ヒント1を見る

Circle の定義は Point の定義より後に書きます(Point を先に使うため)。

ヒント2を見る

初期化は Circle c = {5.0, {0, 0}};(メンバの順番どおり)で書けます。

実際に動かしてみよう

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

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

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