C言語

共用体の基本

構造体型とよく似た型に共用体型があります。
今回は、この共用体の仕組みについて解説します。

共用体型の仕組み

共用体は、同じメモリの場所を複数の変数で共有したいときに使います。
「同じデータを、別の見方で扱いたい」ときに使うことが多いです。
例えば、1つのint型(4byte)の変数を、char型の配列[4]の変数として参照したいなど。

共用体型の定義の構文は次の通りです。

union 共用体型名 {
  型名1 メンバー名1;
  型名2 メンバー名2;
  型名3 メンバー名3;
};

共用体型は、構造体型のstructキーワードのかわりに、union キーワードを使います。

実際に、共用体型を定義すると次のようになります。

union Data {
    int i;
    char c;
};

この場合、int型のメンバーiと、char型のメンバーcは、同じメモリの場所を共有します。

共用体の定義と使い方

共用体は、構造体の定義と使い方と同じです。

共用体の定義の構文は次の通りです。

union 共用体型名 共用体変数名;

共用体の使い方は、構造体と同様に、.(ドット)でメンバーにアクセスします。

次に共用体を使用したプログラムを見てみましょう。

#include <stdio.h>

union Data {
  int i;
  char c;
};

int main(void)
{
  union Data data;

  data.i = 65; // 整数として代入
  printf("整数としての値: %d\n", data.i);
  printf("文字としての値: %c\n", data.c);

  return 0;
}

実行結果は次の通りです。

整数としての値: 65
文字としての値: A

このプログラムでは、data.i に整数の65を代入しました。
これにより、data.c も65になります。これは、data.iと同じメモリを共有しているからです。
ところが、data.c を文字として見ると 'A' になります。
なぜなら、文字 'A' の文字コードが65だからです。
このように、同じデータを異なる型で見るということができます。

まとめ

  • 共用体(union)は、同じメモリを複数のメンバーで共用する仕組み
  • 見た目は構造体に似ているが、メモリの使い方がまったく異なる。
  • 共用体のメンバーは、すべて同じ場所(同じ箱)を使う
  • 「最後に書き込んだメンバー」と「読み出すメンバー」を一致させて使う。
  • 同じデータを別の型として読みたいときや、メモリを節約したいときに使われる。
  • 初心者のうちは「こういう仕組みがある」ことを知っておくだけで十分。

-C言語