共用体: メモリの共有

「箱」は一つだけ。中身の解釈を変える変態的な型。

共用体 (Union)
全てのメンバが同じメモリ領域を共有する型。一度に1つのメンバしか使えない。
エンディアン
マルチバイトデータを並べる順序。これを確認するために共用体が使われることがある。
共用のロッカー (Shared Locker)

共用体は「たった1つしかない共用ロッカー」です。 このロッカーには、野球のバット(int)、テニスラケット(float)、ボール(char)のどれか1つを入れることができます。 しかし、バットを入れた後にラケットを取り出そうとすると、意味不明な物体(壊れたデータ)が出てきます。スペースを節約できますが、中身が今何であるかは自分で覚えておく必要があります。

場所を共有する

共用体 (union) は、構造体と定義方法は似ていますが、中身は全く違います。構造体がメンバごとに場所を確保するのに対し、共用体は 「全てのメンバで同じ場所(一番大きいメンバのサイズ)」を使い回します。

つまり、int を書き込んでから float を読み出すと、壊れた(あるいはビットレベルで解釈された)値が出てきます。「あるいは (OR)」の関係です。

Union Behavior
union Data {
int i;
float f;
char str[4];
};
union Data data;
data.i = 0x12345678;
// 全員が同じ場所を見ている
printf("%x\n", data.i); // 12345678
printf("%c\n", data.str[0]); // エンディアンによって 0x78 か 0x12 が見える