共用体とは
共用体とはデータ構造の一種です。
メモリ領域を複数の変数で共有して扱うことが出来ます。
あまり利用する機会はありませんが、知っておくと良いでしょう。
例を見てみましょう。
以下は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が並んで表記されています。
(adsbygoogle = window.adsbygoogle || []).push({});

