logo

C 조합

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

Unions-in-c

C의 Union 구문

C의 공용체 구문은 다음과 같은 세 단계로 나눌 수 있습니다.



C 노조 선언

이 부분에서는 Union의 템플릿만 선언합니다. 즉, Union 이름과 함께 멤버의 이름과 데이터 유형만 선언합니다. 선언에서 공용체에 메모리가 할당되지 않습니다.

 union union_name { datatype member1 ; datatype member2 ; ... };>

Union 선언은 항상 세미콜론으로 끝나야 한다는 점을 명심하세요.

Union 변수를 정의하는 다양한 방법

공용체 멤버를 사용하려면 공용체 유형의 변수를 정의해야 합니다. 공용체 변수를 정의하는 데 사용되는 두 가지 방법이 있습니다.



  1. 연합 선언문과 함께
  2. 연합 선언 이후

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의 메모리 할당

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

>