C言語入門(20)存在価値が分かりづらい共用体を活用したい

Posted: 2012年12月27日

前回は、構造体について書きましたが
今回は、共用体(union)について書いていきます。

実際unionっていつ役立つのか、どのように使用すれば良いのか
さっぱりわからない時がありました。
参考書を読んでも使い方だけと・・・

実際にもそこまで使い道はないけれど
痒いところに手が届く手段として理解してもらえればと

共用体は、構造体と定義の仕方は同様であり

 // 共用体
 union UNum_ {
  int nNum;
  byte bByte[4];
 };

パッと見は、構造体のようにしか見えませんが
構造体と異なる点は、nNumもbByteも同様の値を返します。
nNumに1を代入した場合bByteにも1が代入されたことになります。

データが同じになるため、なかなか使いどころが不明なところがあります。
今回の例では、nNumに代入した値は、byte配列に変換されます。

int = 4byte, byte = 1byte

そのため bByteは、4つの配列になっています。
このunionはIPアドレスの変換で用いることも考えられます。

このような使い方が個人的には一般的な使い方と思っています。

そのほかには、

 // 共用体
 union UData_ {
  std::string str;
  int nNum;
 };

 union UData_ aryData[5];

この例では、数値か文字列が設定可能な配列を定義することができます。
タイプセーフではないため(データ型が自由なため誤った方で使用してしまう)
 使用する際には、注意が必要ですが
どうしても、様々な型を設定する必要がある場合は、この手段を取るといいと思います。

もっと安全にするためには、

 // 構造体
 struct SData_ {
  int nType;
  union UData_ data;
 };

 // 共用体
 union UData_ {
  std::string str;
  int nNum;
 };

 struct SData_ aryData[5];

構造体に型情報を持たせることで
使用する場合型情報通り処理を行えば問題はなくなります。

練習練習:

  1. ほかにどのようなに共用体を活用できるか考えてみてください。
カテゴリー: プログラム, 入門 | タグ: , | コメント無し »

コメント