トップC言語入門 > 共用体(union)

共用体(union)

1.共用体(union)

複数の型が同一のメモリ領域を共有する構造を共用体(union)という。 unionという用語自体はSQLでも使われるが、全く意味が異なる。

プログラミング言語でC言語,C++と同じまたは似た概念でunionが登場する言語は知らない。 著名な言語ではC,C++以外おそらく存在しないだろう。

個人的には使わないようにしている。 しかし、Win32 APIなどでは機能を拡張する時などで一部使われているため、仕様および使い方は理解しておかねばならない。

基本的な書式は下に示すように、構造体定義での structure を union に変えたものとなっている。 要素の参照方法は構造体の場合と同様であり、data.i、pData->s などとなる。

構造体とは違い、共用体では全ての要素のオフセットは 0 である。

union mydata {
        int i;
        double d;
        char *s;
};

union mydata data, *pData;

unionの初期化は最初のメンバの型の値でのみ可能である。上記の例でばdataはint型でのみ初期化可能である。

上の例で data.s = "abc" とした場合、この共用体には文字列 "abc" のアドレスが格納される。 32ビットマシンでは、int型とchar*型のサイズは同じ32ビットであるから、data.i でこのアドレスが取り出される。 もちろん、unionはこのような使い方をするためのものではない。 データ型が異なっているため、一般には、別のデータ型で取り出しても意味はない。

次の例では、構造体 data.ni と構造体 data.nd が重なり合っており、それぞれの先頭が同じデータ型int であるため、 要素 data.ni.type と要素 data.nd.type はぴったり重なり合っている。 data.ni.type = 1; とすれば、data.nd.type の値も同じ値の 1 となる。

union mydata {
        struct {
                int type;
                int i;
        } ni;
        struct {
                int type;
                double d;
        } nd;
} data;

2.共用体(union)の操作


参考文献

[1] C言語のunionについて