共用体型の定義 には、union キーワードと、 その後に続く、オプションの ID (タグ) および中括弧で囲まれたメンバーのリストが含まれます。
共用体定義の形式は、次のとおりです。
>>-共用体--+-identifier--------------------------+------------->< | .-----------. | | V | | '-+------------+--{----member--;-+--}-' '-identifier-'
共用体宣言 は、宣言が中括弧で囲まれたメンバーのリストを持っていないということを除けば、 共用体定義と同じ形式です。
identifier は、メンバー・リストによって指定された共用体に与えられるタグです。 タグを指定すると、以降の共用体の宣言 (同じスコープ内) では、 タグを宣言し、メンバー・リストを省略することができます。 タグを指定しない場合は、その共用体を参照する変数定義をすべて、 データ型を定義するステートメント内に入れる必要があります。
メンバーのリストには、データ型と、共用体に保管できるオブジェクトの記述を指定します。
共用体メンバー定義の形式は、変数宣言の形式と同じです。
共用体のメンバーは、構造体のメンバーと同じ方法で参照することができます。
次に例を示します。
union { char birthday[9]; int age; float weight; } people; people.birthday[0] = '¥n';
'¥n'を、共用体 people のメンバーである、文字配列 birthday の 1 番目のエレメントに代入します。
共用体は、一度に、そのメンバーのうちの 1 つのみしか表すことができません。この例では 、共用体 people には、age、birthday、または weight の いずれか 1 つを含むことができますが、2 つ以上を含むことはできません。次の例では 、printf ステートメントの結果は 正しくありません。これは、people.age が、1 行目で people.birthday に 代入された値を置換するからです。
#include <stdio.h> #include <string.h> union { char birthday[9]; int age; float weight; } people; int main(void) { strcpy(people.birthday, "03/06/56"); printf("%s¥n", people.birthday); people.age = 38; printf("%s¥n", people.birthday); }
上記の例の出力は、次の出力に似ています。
03/06/56 &
関連参照