C言語のtypedefキーワードで構造体を定義する方法をわかりやすく解説
C言語では、typedefキーワードを使うことで、既存のデータ型に新しい名前(別名)を定義できます。ここでは、typedefの基本から、構造体への適用方法まで、具体例を交えて解説します。
typedefとは
C言語では、typedefキーワードを使用して新しいデータ型名を定義することができます。ただし、typedefでまったく新しいデータ型を作成できるわけではなく、すでに存在する型に対して新しい名前を付けるための機能です。
構文
typedef データ型 新しい名前;
基本的な使用例
typedef int bhanu;
int a;
bhanu a;
この宣言のポイントは以下の通りです。
typedef int bhanu;という文は、コンパイラに対して「bhanu」を「int」の別名として認識させる指示です。- 「
bhanu」を使って、新しい変数「a」を宣言できます。 - 「
bhanu a;」は、変数「a」をint型として宣言することと同じ意味になります。
サンプルプログラム
次のプログラムでは、int型に「hours(時間)」という別名を付けて利用しています。
#include <stdio.h>
int main(void) {
typedef int hours;
hours h; /* int h; と同じ意味 */
printf("Enter hours: ");
scanf("%d", &h);
printf("Minutes = %d\n", h * 60);
printf("Seconds = %d\n", h * 60 * 60);
return 0;
}
実行結果
Enter hours: 1
Minutes = 60
Seconds = 3600
このように、hoursはint型とまったく同じように動作しますが、プログラムの意図がより明確になり、可読性が向上します。
構造体をtypedefで定義する例
typedefは構造体と組み合わせると特に便利です。構造体タグ名を毎回書く手間が省け、宣言がシンプルになります。
#include <stdio.h>
typedef struct employee {
int eno;
char ename[30];
float sal;
} emp;
int main(void) {
emp e = {10, "ramu", 5000};
printf("number = %d\n", e.eno);
printf("name = %s\n", e.ename);
printf("salary = %.0f\n", e.sal);
return 0;
}
実行結果
number = 10
name = ramu
salary = 5000
解説
typedef struct employee {...} emp;により、struct employeeという構造体型に「emp」という別名が付きます。- 以降は
struct employee e;と書く代わりに、emp e;だけで構造体変数を宣言できます。 - 初期化では、メンバ
enoに10、enameに"ramu"、salに5000を設定しています。 - 文字列メンバの表示には
%s、float型には%fを使用する点に注意しましょう。
まとめ
typedefを使うと、既存の型や構造体にわかりやすい別名を付けられるため、コードの可読性と保守性が向上します。特に構造体を頻繁に扱うプログラムでは、宣言が簡潔になるメリットが大きいため、積極的に活用するとよいでしょう。
-
C言語のelse ifラダー(階段状分岐)ステートメント徹底解説
else ifラダーは、複数の条件から1つを選ぶ「多方向分岐」を記述する際に最も一般的に使われる構文です。上から順に条件を評価し、最初に真となったブロックだけを実行し、残りはすべてスキップします。基本構文else ifラダーの基本的な書き方は以下のとおりです。if (condition1) stmt1; else if (condition2) stmt2; - - - - - - - - - - else if (condition n) stmtn; else stmt x;条件1が偽であれば次の条件2へ、それも偽であればさらに次の条件へと、いずれかの条件が真になるまで順番に評価が進みます
-
構造体の概念で理解するC言語のビットフィールド|定義方法と範囲の計算を徹底解説
ビットフィールドとはビットフィールドとは、変数が占めるメモリのサイズをビット単位で指定できるC言語の機能です。通常は構造体(struct)の中で定義されます。ビットフィールドの基本:1バイト=8ビット記述例struct info { int x : 2; };この例では、メンバxは2ビットを占有します。ビットフィールド使用時の注意点ビットフィールドの範囲外の値を代入することはできません(その場合の動作は保証されません)。sizeof演算子やアドレス演算子(&)をビットフィールドに適用できないため、scanf関数で値を入力することもできません。ビットフィールドに指定できるデータ型