C言語の typedef とは?型の別名の意味と struct との組み合わせをわかりやすく解説

目次

C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。

C言語には、型に別名をつけるためのキーワードがあります。
それが typedef です。

typedef を使うと、長い型名を短く書けるようになります。

例えば

C
unsigned long counter;

typedef を使うと

C
typedef unsigned long ULONG;

ULONG counter;

と書けます。

ただし typedef は単なる省略ではありません。
struct やポインタと組み合わせると、可読性や設計に大きく影響します。

この記事では typedef の意味と使い方を、初心者向けに順番に解説します。


typedefとは

typedef は型に別名をつけるキーワードです。

C
typedef 元の型 別名;

C
typedef int INT;

すると

C
INT a;

と書けます。

これは次と同じ意味です

C
int a;

つまり typedef は
新しい型を作るのではなく、型の別名を作るだけ です。


typedefの主な用途

typedef の主な用途は3つです。

① 型名を短くする
② struct を使いやすくする
③ 抽象化(設計)に使う


型名を短くする

例えば

C
unsigned char value;

毎回書くのは長いです。

typedef を使うと

C
typedef unsigned char uint8;

uint8 value;

読みやすくなります。


structを使いやすくする

通常の struct

C
struct User {
    int id;
};

変数宣言

C
struct User user;

毎回 struct が必要です。

typedef を使うと

C
typedef struct {
    int id;
} User;

使用

C
User user;

すっきり書けます。

structの使い方についてはこちらの記事で解説しています。


typedefはstruct名とは別

このコード

C
typedef struct {
    int id;
} User;

ここで作られる型は

C
User

だけです。

実は

C
struct User

という型は存在しません。

つまりこれはエラー

C
struct User a;   // エラー

struct名を付けていないからです。


struct名も付ける書き方

struct名も使いたい場合

C
typedef struct User {
    int id;
} User;

これで両方使えます。

C
User a;
struct User b;

ポインタ宣言の基本(ここ重要)

まずこれを理解する必要があります。

C
int* a, b;

多くの人はこう思います

C
a → int*
b → int*

でも違います。

実際はこうなります

C
a → int*
b → int

なぜこうなるのか

理由は

* は型ではなく変数にかかる

この宣言はこう解釈されます

C
int *a;
int  b;

つまり

C
int* a, b;

  • a はポインタ
  • b は普通の int

になります。

これがC言語の重要なルールです。


typedefでポインタを作る

次に typedef

C
typedef int* intptr;

これは

C
intptr = int*

という意味です。

だから

C
intptr a, b;

はこうなります

C
int* a;
int* b;

普通の宣言との違い

普通の宣言

C
int* a, b;

C
int* a;
int  b;

typedef

C
typedef int* intptr;
intptr a, b;

C
int* a;
int* b;

ここが混乱ポイントです。


危険なケース

C
typedef int* intptr;

intptr a, b;
b = 0;

これは

C
int* b;
b = 0;

つまり NULL ポインタになります。

さらに

C
*b = 0;

と書くと

NULL参照でクラッシュします。


さらに危険

C
typedef int* intptr;

intptr b;
*b = 0;

これは

C
int* b;  // 未初期化
*b = 0;

未定義動作になります。


安全な書き方

ポインタtypedefは避けるのが安全

NG

C
typedef int* intptr;

OK

C
typedef int INT;

INT* a;
INT* b;

これならポインタかどうか分かります。


struct typedefは安全

C
typedef struct {
    int id;
} User;

使用

C
User user;
User* ptr;

ポインタが明確に分かります。


まとめ

typedef は型の別名を作るキーワード

C
typedef int INT;

struct と組み合わせると便利

C
typedef struct {
    int id;
} User;

ポインタtypedefは注意

C
typedef int* intptr;  // 誤解しやすい

代わりに

C
typedef int INT;
INT* ptr;

の方が安全です。

この記事が参考になった方へ

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次