C言語 共用体(Union)解説: 定義・使用法・構造体との比較
C言語 共用体(Union)解説
C言語の共用体の定義、作成、アクセス方法を学び、メモリレイアウトと用途における構造体との違いを理解します。
共用体はC言語のユーザー定義型で、構造体とは異なり、一度にメンバーの値のどれか1つだけを保持できます。これにより、メモリ効率の良いデータ表現や、低レベルプログラミングでの型パンニングに最適です。
共用体の定義
unionキーワードで新しい型を宣言します。例:
union Car {
char name[50];
int price;
};
上記コードは、50文字の文字列または整数価格のどちらかを格納できる派生型union Carを作成します。
共用体変数の作成
共用体の定義だけではメモリは確保されません。使用するにはその型の変数を宣言します:
union Car car1, car2, *car3;
あるいは、定義と変数宣言を併記することもできます:
union Car {
char name[50];
int price;
} car1, car2, *car3;
両例で、car1とcar2は共用体インスタンス、car3は共用体へのポインタです。
共用体メンバーへのアクセス
直接アクセスにはドット(.)演算子、ポインタ経由にはアロー(->)演算子を使用:
car1.price–car1のpriceフィールドにアクセス。car3->priceまたは(*car3).price– ポインタ経由でpriceにアクセス。
共用体 vs 構造体
構造体は全メンバー分のスペースを確保しますが、共用体のサイズは最大のメンバーのサイズと等しいです。以下の比較を見てください:
#include <stdio.h>
union UnionJob {
char name[32];
float salary;
int workerNo;
} uJob;
struct StructJob {
char name[32];
float salary;
int workerNo;
} sJob;
int main() {
printf("size of union = %zu bytes\n", sizeof(uJob));
printf("size of structure = %zu bytes", sizeof(sJob));
return 0;
}
出力:
size of union = 32 size of structure = 40
構造体は40バイト(32+4+4)を占有するのに対し、共用体は最大メンバーname[32]の32バイトのみを占有します。共用体の全メンバーは同じメモリ領域を共有します。
実践例: メンバーの上書き
#include <stdio.h>
union Job {
float salary;
int workerNo;
} j;
int main() {
j.salary = 12.3;
j.workerNo = 100; // 前の値を上書き
printf("Salary = %.1f\n", j.salary);
printf("Number of workers = %d", j.workerNo);
return 0;
}
出力:
Salary = 0.0 Number of workers = 100
salaryとworkerNoが同じメモリを共有するため、一方に書き込むと他方がクリアされます。
実用的なユースケースについては、「なぜC言語で共用体が必要なのか?」を参照してください。
C言語
- 業務用エアコン適正サイズ選定の専門ガイド:最適パフォーマンスのために
- 製造業におけるAI市場、2026年までに48億ドル規模へ、CAGR 28.1%で成長
- 空圧バルブサイジングの実践ガイド:基礎から応用まで
- 管継手ユニオンの定義・用途・メリット:異種金属管接続と着脱容易性
- ガンスミス(銃器製造・修理)に最適な旋盤サイズの選び方:完全ガイド
- エアレシーバーの適正サイズ選定:性能と効率を最適化
- 産業用エアコンプレッササイジング:適切なユニット選定のエキスパートガイド
- アルミニウムバーストックを安全かつ精密に切断するプロフェッショナルガイド
- C言語共用体:複数データ型の効率的なメモリ管理
- Java Enum完全ガイド:列挙型とEnumクラスの活用法
- Java Enumコンストラクタ徹底解説:実践例で理解する