C言語 | 構造体宣言 | 共用体 - union
共用体は構造体に似ていますが、すべてのメンバが同じ記憶領域を共有します。サイズは最大のメンバを格納できる大きさです。
異なる型でメモリを共有する
union キーワードで共用体を宣言します。
union タグ名 {
型 メンバ名;
...
} 変数名;
メンバへのアクセス方法は構造体と同じですが、各メンバのアドレスは同じです。
#include <stdio.h>
union Value {
unsigned char chValue;
int iValue;
};
int main() {
union Value u;
u.iValue = 0xFFFF;
printf("chValue = %08X : &chValue = %p\n"
"iValue = %08X : &iValue = %p\n",
u.chValue, (void *)&u.chValue, u.iValue, (void *)&u.iValue);
return 0;
}
結果はバイト順などの表現方法に依存します。共用体には構造体、配列、別の共用体も含められます。行列を名前付きフィールドと添字付き配列の両方で公開することもできます。
共用体の初期化
メンバは記憶領域を共有するため、一度に1つのメンバを初期化します。指示子なしの初期化子は最初のメンバを初期化します。
union Point {
struct {
short int x, y;
} point;
int location;
};
union Point u = { { 100, 50 } };
このようにパックされた値を解釈するコードは、型のサイズとバイト順に依存します。前提条件を明確にした上で使用してください。