C ユニオン
Union は C 言語のユーザー定義データ型で、構造体と同様にさまざまなデータ型の要素を含めることができます。ただし、構造体とは異なり、C 共用体のすべてのメンバーは同じメモリ位置に格納されます。このため、特定のインスタンスにデータを保存できるメンバーは 1 つだけです。
C の Union の構文
C の共用体の構文は、次の 3 つのステップに分けることができます。
C 連合宣言
この部分では、共用体のテンプレートのみを宣言します。つまり、共用体の名前とともにメンバーの名前とデータ型のみを宣言します。宣言内の共用体にはメモリが割り当てられません。
union union_name { datatype member1 ; datatype member2 ; ... }; 共用体宣言は常にセミコロンで終了する必要があることに注意してください。
ユニオン変数を定義するさまざまな方法
共用体メンバーの使用を開始するには、共用体型の変数を定義する必要があります。共用体変数を定義するには 2 つの方法があります。
- 連合宣言あり
- 連合宣言後
1. 宣言による共用体変数の定義
union union_name { datatype member1; datatype member2; ... } var1, var2, ...; 2. 宣言後の共用体変数の定義
union union_name var1, var2, var3 ...;
どこ 組合名 すでに宣言されている共用体の名前です。
組合員へのアクセス
構造体と同様に ( . ) ドット演算子を使用して共用体のメンバーにアクセスできます。
var1.member1 ;
どこ var1 それは 共用体変数 そして メンバー1 それは 組合員 。
共用体のメンバーにアクセスする上記の方法は、入れ子になった共用体にも機能します。
var1.member1.memberA;
ここ、
- var1 は共用体変数です。
- メンバー1 組合の会員です。
- メンバーA member1 のメンバーです。
C での Union の初期化
共用体の初期化は、単に値を割り当てることによってそのメンバーを初期化することです。
var1.member1 = some_value ;
ここで注意すべき重要な点が 1 つあります。 特定の時点で値を含めることができるメンバーは 1 つだけです。
結合例
C
// C Program to demonstrate how to use union> #include> // union template or declaration> union> un {> > int> member1;> > char> member2;> > float> member3;> };> // driver code> int> main()> {> > // defining a union variable> > union> un var1;> > // initializing the union member> > var1.member1 = 15;> > printf> (> 'The value stored in member1 = %d'> ,> > var1.member1);> > return> 0;> }> |
出力
The value stored in member1 = 15
組合の規模
共用体のサイズは常に配列の最大のメンバーのサイズと等しくなります。サイズの小さい要素はすべて、オーバーフローすることなく同じスペースにデータを格納できます。
C Union でのメモリ割り当て
例 1: 共用体のサイズを調べる C プログラム
C
// C Program to find the size of the union> #include> // declaring multiple unions> union> test1 {> > int> x;> > int> y;> } Test1;> union> test2 {> > int> x;> > char> y;> } Test2;> union> test3 {> > int> arr[10];> > char> y;> } Test3;> // driver code> int> main()> {> > // finding size using sizeof() operator> > int> size1 => sizeof> (Test1);> > int> size2 => sizeof> (Test2);> > int> size3 => sizeof> (Test3);> > printf> (> 'Sizeof test1: %d
'> , size1);> > printf> (> 'Sizeof test2: %d
'> , size2);> > printf> (> 'Sizeof test3: %d'> , size3);> > return> 0;> }> |
出力
Sizeof test1: 4 Sizeof test2: 4 Sizeof test3: 40
C ストラクチャーと C ユニオンの違い
次の表に、C の構造体と共用体の主な違いを示します。
| 構造 | 連合 |
|---|---|
| 構造体のサイズは、そのすべてのメンバーの合計サイズ以上です。 | 共用体のサイズは、その最大のメンバーのサイズとなります。 |
| 構造体には複数のメンバーのデータを同時に含めることができます。 | 同時にデータを含めることができるメンバーは 1 つだけです。 |
| struct キーワードを使用して宣言されます。 | これは、union キーワードを使用して宣言されます。 |
C ユニオンに関する FAQ
1. 指定された結合のサイズはどれくらいですか?
union un { int a; int arr[20]; } 回答: 指定された共用体のサイズは 20 x 4 バイト = 80 バイトです。配列が類似のデータ要素のコレクションであっても、C コンパイラでは単一のエンティティとみなされます。
2. 複数の共用体メンバーに同時にデータを保存できますか?
いいえ。データを同時に保存できるのは 1 つのメンバーのみです。たとえば、次の C プログラムでは、x と y の両方が同じ場所を共有します。 x を変更すると、その変更が y に反映されることがわかります。
C
// C program to check if we can store data in multiple union> // members> #include> // Declaration of union is same as structures> union> test {> > int> x, y;> };> int> main()> {> > // A union variable t> > union> test t;> > t.x = 2;> // t.y also gets value 2> > printf> (> 'After making x = 2:
x = %d, y = %d
'> , t.x,> > t.y);> > t.y = 10;> // t.x is also updated to 10> > printf> (> 'After making y = 10:
x = %d, y = %d
'> , t.x,> > t.y);> > return> 0;> }> |
出力
After making x = 2: x = 2, y = 2 After making y = 10: x = 10, y = 10
3. 労働組合の用途は何ですか?
共用体は、2 つ以上のメンバーに同じメモリを使用したい多くの状況で役立ちます。たとえば、各リーフ ノードが 2 つのデータ値を持ち、各内部ノードが 2 つの子へのポインタを持つがデータがないバイナリ ツリー データ構造を実装するとします。これを次のように宣言すると、
C
struct> NODE {> > struct> NODE* left;> > struct> NODE* right;> > double> data;> };> |
この場合、すべてのノードに 16 バイトが必要となり、ノードのタイプごとに半分のバイトが無駄になります。一方、ノードを次のように宣言すると、スペースを節約できます。
C
struct> NODE {> > bool> is_leaf;> > union> {> > struct> {> > struct> NODE* left;> > struct> NODE* right;> > } internal;> > double> data;> > } info;> };> |