★構造体とtypedef★


ここで、typedefという命令について触れておきます。

typedefとは、ある型(intやfloatなど)に対して新しい名前を定義するための命令です。

文法は↓のようになります。

<型の再定義>

typedef 既存の型 新しい名前;

例えば、int型に別の名前「integer」を定義すると以下のようになります。

<int型にintegerという新しい名前を付ける>

typedef int integer;

※元の型名を強調するため色を変えています。


実際のプログラムで使ってみましょう。

<sample program 103-01>

#include <stdio.h>

typedef int integer;

int main(void)
{
    integer a;

    a = 3;

    printf("%d\n", a);

    return 0;
}

<実行結果>

3
続行するには何かキーを押してください・・・

新しく作ったinteger型はint型と同じように使えます。

もちろんint型が無くなった訳ではなく、int型も普通に使えます


ここまでの説明では「使い道」が分かりません・・・

なぜ、このような命令が存在するのでしょうか?

理由はいくつかありますが、実際に使われている例を踏まえて2つほど書いておきます。


1.その変数が何に使われるか名前で識別出来るようにする。

 まだ関数などの説明をしていないため、詳細は書けませんが、size_t型やtime_t型という型が出てくるケースがあります。

 どちらもC言語に元から用意されている型ではありません。

 どこかで型が再定義されており、このような名前になっていますが、元はint型やunsigned int型といった型です。

 size_tはバイト数などを格納する際に良く使われます。

 time_tは時間を入れるための変数として使われています。

 intやunsigned intだけでは使用目的までは分かりませんが、名前が付いていれば使用目的を推測出来ます。


2.長い名前を短縮する。

 WindowsでのプログラミングではUINTやDWORDなどの名前が付いた型を使うことも多いです。

 UINTはunsigned int型の再定義です。

 DWORDはunsigned long型の再定義です。

 unsignedが付いている型の名前を短縮するために使われている例を紹介しましたが、構造体にも使われます。

 例えば、↓のような構造体があったとします。

struct Character
{
    int hp;
    int mp;
};

 構造体の最初に説明したように、構造体も「ユーザ定義型」という型です。

 ですから、↑の構造体も「struct Character」という型になります。

 型の再定義を使い、「Player」という名前を付けてみます。

struct Character
{
    int hp;
    int mp;
};

typedef struct Character Player;

 これで、「struct Character型」は「Player型」という名前でも使えるようになりました。

 以降はstructというキーワードを付けなくても構造体が使えるようになります。


例を書いておきましょう。

<sample program 103-02>

#include <stdio.h>

struct Character
{
    int hp;
    int mp;
};

typedef struct Character Player;

int main(void)
{
    Player p1;

    p1.hp = 100;
    p1.mp = 50;

    return 0;
}

構造体の宣言と型定義を同時に行う書き方もよく見かけます。

<sample program 103-03>

#include <stdio.h>

typedef struct
{
    int hp;
    int mp;
} Player;

int main(void)
{
    Player p1;

    p1.hp = 100;
    p1.mp = 50;

    return 0;
}

この方法では、Characterという構造体のタグ名は書かれておらず、構造体の宣言と同時にPlayerという名前が付けられています。

横に並べて書くと分かりやすいかも知れません。

typedef struct{ int hp; int mp; } Player;

次回からは、こちらの方法をメインで使います。


次へ

戻る

目次へ