Union은 구조와 마찬가지로 다양한 데이터 유형의 요소를 포함할 수 있는 C 언어의 사용자 정의 데이터 유형입니다. 그러나 구조와 달리 C 공용체의 모든 멤버는 동일한 메모리 위치에 저장됩니다. 이로 인해 해당 인스턴스에는 단 하나의 멤버만 데이터를 저장할 수 있습니다.

C의 Union 구문
C의 공용체 구문은 다음과 같은 세 단계로 나눌 수 있습니다.
C 노조 선언
이 부분에서는 Union의 템플릿만 선언합니다. 즉, Union 이름과 함께 멤버의 이름과 데이터 유형만 선언합니다. 선언에서 공용체에 메모리가 할당되지 않습니다.
union union_name { datatype member1 ; datatype member2 ; ... };>
Union 선언은 항상 세미콜론으로 끝나야 한다는 점을 명심하세요.
Union 변수를 정의하는 다양한 방법
공용체 멤버를 사용하려면 공용체 유형의 변수를 정의해야 합니다. 공용체 변수를 정의하는 데 사용되는 두 가지 방법이 있습니다.
- 연합 선언문과 함께
- 연합 선언 이후
1. 선언을 통한 Union 변수 정의
union union_name { datatype member1; datatype member2; ... } var1, var2, ...;>
2. 선언 후 Union 변수 정의
union union_name var1, var2, var3 ...;>
어디 노동조합 이름 이미 선언된 노동조합의 이름입니다.
액세스 조합 회원
구조체와 마찬가지로 ( . ) 점 연산자를 사용하여 공용체의 멤버에 액세스할 수 있습니다.
var1.member1 ;>
어디 var1 은 공용체 변수 그리고 멤버1 은 조합원 .
Union의 구성원에 액세스하는 위의 방법은 중첩된 Union에도 적용됩니다.
var1.member1.memberA;>
여기,
- var1 공용체 변수입니다.
- 멤버1 조합원입니다.
- 멤버A member1의 회원입니다.
C에서 Union 초기화
공용체의 초기화는 단순히 값을 할당하여 멤버를 초기화하는 것입니다.
var1.member1 = some_value ;>
여기서 한 가지 중요한 점은 주어진 시간에 단 하나의 멤버만이 어떤 값을 포함할 수 있습니다.
유니온의 예
씨
// 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 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의 구조와 공용체의 주요 차이점이 나열되어 있습니다.
구조 | 노동 조합 |
---|---|
구조의 크기는 모든 구성원의 전체 크기와 같거나 더 큽니다. | Union의 크기는 가장 큰 구성원의 크기입니다. |
구조에는 동시에 여러 멤버의 데이터가 포함될 수 있습니다. | 한 번에 하나의 멤버만 데이터를 포함할 수 있습니다. |
struct 키워드를 사용하여 선언됩니다. | Union 키워드를 사용하여 선언됩니다. |
C Union에 대한 FAQ
1. 해당 노조의 규모는 얼마나 됩니까?
union un { int a; int arr[20]; }>
답변: 주어진 공용체의 크기는 20 x 4바이트 = 80바이트입니다. 배열이 유사한 데이터 요소의 모음이라도 C 컴파일러에서는 단일 엔터티로 간주됩니다.
2. 여러 조합원의 데이터를 동시에 저장할 수 있나요?
아니요. 동시에 단일 멤버에만 데이터를 저장할 수 있습니다. 예를 들어 다음 C 프로그램에서 x와 y는 모두 동일한 위치를 공유합니다. x를 변경하면 변경 사항이 y에 반영되는 것을 볼 수 있습니다.
씨
// 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. 노동조합의 적용은 무엇입니까?
Union은 둘 이상의 멤버에 대해 동일한 메모리를 사용하려는 많은 상황에서 유용할 수 있습니다. 예를 들어, 각 리프 노드에는 이중 데이터 값이 있고 각 내부 노드에는 두 개의 자식에 대한 포인터가 있지만 데이터는 없는 이진 트리 데이터 구조를 구현한다고 가정합니다. 이것을 다음과 같이 선언하면:
씨
struct> NODE {> > struct> NODE* left;> > struct> NODE* right;> > double> data;> };> |
>
>
그러면 모든 노드에는 16바이트가 필요하며 각 노드 유형에 대해 절반의 바이트가 낭비됩니다. 반면에 다음과 같이 노드를 선언하면 공간을 절약할 수 있습니다.
씨
struct> NODE {> > bool> is_leaf;> > union> {> > struct> {> > struct> NODE* left;> > struct> NODE* right;> > } internal;> > double> data;> > } info;> };> |
>
df loc
>