11.構造体

11-4. 共用体

◇共用体

1.共用体とは?

 共用体とは、1つのデータを異なる型で利用できるようにするものです。
これだけでは、説明不足なので具体的に解説します。

例えば、var1 という変数を int型とfloat型で使いたい!
というときに共用体で定義すれば、int型とfloat型両方で使える変数として定義されます。

2.定義

それでは早速、共用体を定義してみましょう。
構造体(struct)に変わってunionを使います。

union u_var{
int i;
float f;
};

3.宣言

union u_var var1;

定義と宣言については構造体とほとんど変わりがありません。
もちろん typedef を使用して簡略化することもできます。

4.利用例

利用例としてサンプルプログラムを以下に示します。

#include<stdio.h>
union u_var{
        int i;
        float f;
};


main()
{
        union u_var var1;
        
        var1.i=3;
        printf("%d\n",var1.i);
        
        var1.f=15.6;
        printf("%f\n",var1.f);
        return;
}

/* 結果
3
15.600000
*/

ん?構造体のときとなんら変わらない???と思われたと思います。

しかし、共用体と言うからには何処かが共有されているはずです。

◇共用体の共有部分

1.共用体の共有部分

例えば、
union u_test{
int i;
float f;
}u1;

と宣言した場合、メモリーマップは次のようになります。

u1
+—————–+
| | |
+—————–+
|-i(int)-| |
|—- f(float) —|

ちょっと分かりにくいかもしれませんが、i も f も同じアドレスを使用しています。

そして、メモリの領域はメンバの中でもっとも大きい型(ここではfloat型)だけ確保します。

共有体の利点は、同じアドレスを利用すること(ポインタで渡すときなど便利)とメモリーの節約になることです。

ただし、問題点としては同じ領域を使用するため、ある型で代入を行った後、別の型として呼び出すととんでもない値になることです。

つまり

u1.i = 3;

としたあと

u1.f = 12.0;

とした場合、前のu1.iの値は書きかえられてしまい、この後にu1.iを呼び出しても 3 ではなくなっています。

これが共用体の概要になります。
応用した利用法などについては構造体に戻ってからやってみたいと思います。