はいどうも、シュモクザメです。
参考書や講義の資料で構造体を勉強していると、
typedef struct node{
int a;
int b;
}node;
ちょくちょくtypedefっていう文字見ますよね、
今日はあれが何なのかを説明して、
有用性について語ってみます。
typedef宣言とは
typedef宣言っていうのは、上のコードでstructの前に付けられているtypedefのことです。
この宣言を行うことで既存の型に新しい名前を与えることができます。

この図の例だと今、Aはintだと思えば良いので
typedef int A;
A = 3;
という文が成り立ちます。
大事なのは
新しい型自身を作るのではなく、
既存の型に新しい名前をつける
ということです。
もちろんAを宣言したとでもint型は使えます。
構造体の宣言でよく使われる理由
簡単に言うと記述量を減らすためです。
例えば(node)という構造体を宣言するとき、
struct node{};
と宣言します。
この前についているstructは構造体宣言の際に必要な文ですが、
それだけではなくて、これ自身も構造体の名前の一部になっています。
つまり上の例だと、構造体の名前は
node ではなく、
struct node なんです。
もっと砕いて説明すると
int型でいう”int”が
この構造体では”struct node”なんです。
つまりその構造体を使いたいところで宣言したり、
関数の仮引数や返り値として設定するときに
いちいちstruct nodeと記述する必要があるんですね。
めんどくさいし書き間違えの原因になりますね。
なので
typedef struct node{
int a;
int b;
}node;
このように typedefを使うことで
この構造体の名前を
struct node から node に変更して使いやすいようにしています。
新しい名前は何でも良い?
typedefでつける新しい名前は何でも良いです。
上のコードだと
struct node の struct 部分をとった node を
新しい名前にしていますが、
別に何でも良いです。
NODEでもいいですし、全く関係ない名前でもおkです。
構造体で使う場合の注意点
構造体にtypedefを用いた場合に、
その構造体に新しい名前が与えられるのはtypedef宣言が終わってからです。
つまり以下のようなコードはだめです。
typedef struct node{
int a;
int b;
NODE* next;
}NODE;
構造体の内部ではまだNODEが適用されて無いからですね。
この場合は
NODE *nextを struct node* nextになおすか、
typedef struct node NODE;
struct node{
int a;
int b;
NODE* next;
};
このように構造体の中身の定義より先に、
typedef宣言を行います。
構造体以外でtypedefを使う場面
僕がそれなりに長いアルゴリズムを組んでいるときに、
久々に使う変数が出てきた場合、
ん?
この変数は実際に扱っている値が入っているのか?
それとも、何かのフラグ用の変数か?
いや、配列の添字用の変数かも?
やっぱりfor文の現在の回数用の数字か?
って言うことが起きて少し思考が停止してしまいます。
そんなときは
typedef int value;//値
typedef int flag;//フラグ
typedef int index;//配列の添字用
このように宣言して置いて、
対応のものはそのtypedef名で宣言することで
その変数が同じint型だとしても、何用のint型かが
宣言部まで戻ればすぐに分かります。
終わり
僕が参考書を読んだとき、
なんの説明もなくソースコードの中でtypedefで型名を変えていたので、
まじでわけわからんくなってました。
誰かの役に立てば幸いです。
ではまた〜
コメント