共用体の宣言

共用体型の定義 には、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 には、agebirthday、または 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
&

関連参照

IBM Copyright 2003