Cユニオン
Union は、同じメモリ場所に異なるデータ型を保存できる特別なデータ型です。複数のメンバーを含む共用体を定義できますが、値を持つことができるメンバーは常に 1 つだけです。共用体は、同じメモリ位置を効率的に使用する方法を提供します。
共用体を定義する
共用体を定義するには、構造体を定義するのと同様の方法で、unionステートメントを使用する必要があります。 Union ステートメントは、複数のメンバーを持つ新しいデータ型を定義します。 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 型の変数は、整数、浮動小数点数、または文字列を格納できます。これは、1 つの変数 (同じメモリ位置) に複数のタイプの複数のデータを格納できることを意味します。必要に応じて、コミュニティ内で任意の組み込みデータ型またはユーザー定義のデータ型を使用できます。
ユニオンが占有するメモリは、ユニオン内の最大のメンバーを格納するのに十分である必要があります。たとえば、上記の例では、文字列がさまざまなメンバーの中で最大の領域を占有するため、データは 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
共用体メンバーへのアクセス
Union では、 メンバー アクセス演算子 (.) を使用します。メンバー アクセス演算子は、共用体変数名とアクセスする共用体メンバーの間のピリオドです。 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 : 1917853763data.f : 4122360580327794860452759994368.000000data.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 : 10data.f : 220.500000data.str : C Programming
ここでは、同時に使用されるメンバーは 1 つだけであるため、すべてのメンバーがそのまま出力されます。