共用体とは
共用体とはデータ構造の一種です。
メモリ領域を複数の変数で共有して扱うことが出来ます。
あまり利用する機会はありませんが、知っておくと良いでしょう。
例を見てみましょう。
以下は1マス1ビットのメモリ1バイト分です。
番号 | [7] | [6] | [5] | [4] | [3] | [2] | [1] | [0] |
データ | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
これを共用体として確保したとしましょう。
このデータをint型として読むと"01000001"は整数値65です。(処理系にも依存しますが、本来int型は4バイトです。)
同じデータをchar型として読んだ場合、アスキーコード65番なので'A'ということになります。
共用体の宣言は構造体と殆ど一緒です。
union 【共用体名】 { 【メンバ宣言】; … }【インスタンス名】;
構造体と同様、共用体名または変数名は省略できます。
共用体名を省略すると宣言したインスタンスのみ使用できます。
インスタンス名を省略した場合は
union 【共用体名】 【インスタンス名】
で宣言し、メモリを確保します。
【インスタンス名】.【メンバ】
でメンバにアクセスできます。
メンバがポインタ型の場合はアロー演算子を使います。
【インスタンス名】->【メンバ】
利用例
サンプルコードを見ていきましょう。
union_sample.c
#include <stdio.h> union myUnion { int i; char c; double d; }; int main(void) { union myUnion u; u.i = 100; printf("%d\n", u.i); printf("%c\n", u.i); printf("%lf\n\n", u.i); u.c = 'A'; printf("%d\n", u.c); printf("%c\n", u.c); printf("%lf\n\n", u.c); u.d = 0.25; printf("%d\n", u.d); printf("%c\n", u.d); printf("%lf\n\n", u.d); return 0; }
共用体myUnionはint、char、double型を持っています。
メンバのどれかに値を代入すると全ての型で値がかわります。
一部表示されないのはメモリ内での記述方法が違うためです。
また、int型で100と表示されるならdouble型では100.0になるのではないかと思われますが、これもデータの表現方法が違うため正しく表示できません。
int型は単純に2進化10進数で表されますが、double型などの不動小数点数はa * 10^bという形でaとbが並んで表記されています。