C/C++

共用体

更新日:

目次

        

  1. 共用体とは
  2. 利用例

共用体とは

共用体とはデータ構造の一種です。
メモリ領域を複数の変数で共有して扱うことが出来ます。

あまり利用する機会はありませんが、知っておくと良いでしょう。

例を見てみましょう。
以下は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が並んで表記されています。



-C/C++

Copyright© ツナのエンジニアブログ , 2024 All Rights Reserved Powered by AFFINGER5.