Cprogramming-c-unions

提供:Dev Guides
移動先:案内検索

C-組合

*union* は、Cで使用可能な特別なデータ型であり、同じメモリ位置に異なるデータ型を格納できます。 多くのメンバーでユニオンを定義できますが、常に1つのメンバーのみが値を含むことができます。 ユニオンは、同じメモリ位置を複数の目的に使用する効率的な方法を提供します。

組合の定義

ユニオンを定義するには、構造の定義中と同じ方法で union ステートメントを使用する必要があります。 共用体ステートメントは、プログラムの複数のメンバーを持つ新しいデータ型を定義します。 ユニオン文の形式は次のとおりです-

union [union tag] {
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];
  • unionタグ*はオプションであり、各メンバー定義はint iなどの通常の変数定義です。またはfloat f;または他の有効な変数定義。 ユニオンの定義の最後で、最後のセミコロンの前に、1つ以上のユニオン変数を指定できますが、これはオプションです。 ここに、3つのメンバーi、f、およびstrを持つDataという名前のユニオン型を定義する方法があります-
union Data {
   int i;
   float f;
   char str[20];
} data;

現在、 Data 型の変数は、整数、浮動小数点数、または文字列を格納できます。 これは、単一の変数、つまり同じメモリ位置を使用して、複数のタイプのデータを保存できることを意味します。 要件に基づいて、ユニオン内で組み込みまたはユーザー定義のデータ型を使用できます。

ユニオンが占有するメモリは、ユニオンの最大メンバーを保持するのに十分な大きさになります。 たとえば、上記の例では、データ型は20バイトのメモリ空間を占有します。これは、これが文字列で占有できる最大の空間だからです。 次の例は、上記のユニオンが占有する合計メモリサイズを表示します-

#include <stdio.h>
#include <string.h>

union Data {
   int i;
   float f;
   char str[20];
};

int main( ) {

   union Data data;

   printf( "Memory size occupied by data : %d\n", sizeof(data));

   return 0;
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Memory size occupied by data : 20

組合員へのアクセス

組合のメンバーにアクセスするには、* memberアクセス​​演算子(。)を使用します。 メンバーアクセス演算子は、ユニオン変数名とアクセスするユニオンメンバー間のピリオドとしてコーディングされます。 キーワード *union を使用して、ユニオン型の変数を定義します。 次の例は、プログラムでユニオンを使用する方法を示しています-

#include <stdio.h>
#include <string.h>

union Data {
   int i;
   float f;
   char str[20];
};

int main( ) {

   union Data data;

   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");

   printf( "data.i : %d\n", data.i);
   printf( "data.f : %f\n", data.f);
   printf( "data.str : %s\n", data.str);

   return 0;
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

ここでは、変数に割り当てられた最終値がメモリ位置を占有しているため、ユニオンの i および f メンバーの値が破損していることがわかります。これが str メンバーの値が出力される理由です。結構。

さて、同じ例をもう一度見てみましょう。ここでは、ユニオンを持つ主な目的である一度に1つの変数を使用します-

#include <stdio.h>
#include <string.h>

union Data {
   int i;
   float f;
   char str[20];
};

int main( ) {

   union Data data;

   data.i = 10;
   printf( "data.i : %d\n", data.i);

   data.f = 220.5;
   printf( "data.f : %f\n", data.f);

   strcpy( data.str, "C Programming");
   printf( "data.str : %s\n", data.str);

   return 0;
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

data.i : 10
data.f : 220.500000
data.str : C Programming

ここでは、一度に1つのメンバーが使用されているため、すべてのメンバーが非常にうまく印刷されています。