logo

C의 유니온

노동 조합 동일한 메모리 위치에 있는 다양한 데이터 유형의 다양한 변수 모음인 사용자 정의 데이터 유형으로 정의할 수 있습니다. 공용체는 여러 구성원으로 정의될 수도 있지만 특정 시점의 값은 단 하나의 구성원만 포함할 수 있습니다.

Union은 사용자 정의 데이터 유형이지만 구조와 달리 동일한 메모리 위치를 공유합니다.

자바는 동안을 한다

예를 통해 이것을 이해해 봅시다.

 struct abc { int a; char b; } 

위의 코드는 두 개의 멤버, 즉 'a' 유형으로 구성된 사용자 정의 구조입니다. 정수 그리고 'b' 유형 성격 . 'a'와 'b'의 주소를 확인해 보니 주소가 서로 다른 것을 알 수 있었습니다. 따라서 구조의 구성원이 동일한 메모리 위치를 공유하지 않는다고 결론을 내립니다.

Union을 정의할 때 Union은 구조체 정의와 동일한 방식으로 정의되지만 차이점은 Union 데이터 형식을 정의하는 데 Union 키워드가 사용되고 구조를 정의하는 데 struct 키워드가 사용된다는 점입니다. 공용체에는 데이터 멤버, 즉 'a'와 'b'가 포함되어 있습니다. 두 변수의 주소를 확인한 결과 둘 다 동일한 주소를 가지고 있음을 발견했습니다. 이는 조합원들이 동일한 메모리 위치를 공유한다는 것을 의미합니다.

메모리 할당을 그림으로 표현한 것을 살펴보겠습니다.

아래 그림은 구조를 그림으로 표현한 것입니다. 구조에는 두 개의 멤버가 있습니다. 즉, 하나는 정수 유형이고 다른 하나는 문자 유형입니다. 1 블록은 1 바이트와 같기 때문에; 따라서 'a' 변수에는 4블록의 메모리가 할당되고, 'b' 변수에는 1블록의 메모리가 할당됩니다.

아래 그림은 조합원들의 모습을 그림으로 표현한 것이다. 두 변수 모두 동일한 메모리 위치를 공유하고 동일한 초기 주소를 갖습니다.

연합에서는 회원들이 기억 장소를 공유하게 됩니다. 멤버 중 하나를 변경하려고 하면 다른 멤버에게도 반영됩니다. 예를 통해 이 개념을 이해해 보겠습니다.

 union abc { int a; char b; }var; int main() { var.a = 66; printf('
 a = %d', var.a); printf('
 b = %d', var.b); } 

위 코드에서 공용체에는 'a'와 'b'라는 두 개의 멤버가 있습니다. 'var'은 Union abc 유형의 변수입니다. 에서 기본() 메서드에서 66을 'a' 변수에 할당하므로 var.a는 화면에 66을 인쇄합니다. 'a'와 'b'는 모두 메모리 위치를 공유하므로 var.b '를 인쇄합니다 '(아스키 코드 66).

노조 규모 결정

노동조합의 규모는 노동조합의 가장 큰 구성원의 규모를 기준으로 결정됩니다.

예를 통해 이해해 봅시다.

 union abc{ int a; char b; float c; double d; }; int main() { printf('Size of union abc is %d', sizeof(union abc)); return 0; } 

우리가 알고 있듯이 int의 크기는 4바이트, char의 크기는 1바이트, float의 크기는 4바이트, double의 크기는 8바이트입니다. 4개의 변수 중 double 변수가 가장 큰 메모리를 차지하므로 총 8바이트의 메모리가 할당됩니다. 따라서 위 프로그램의 출력은 8바이트가 됩니다.

포인터를 사용하여 공용체 멤버에 액세스

(->) 화살표 연산자를 사용하여 포인터를 통해 공용체의 멤버에 액세스할 수 있습니다.

예를 통해 이해해 봅시다.

 #include union abc { int a; char b; }; int main() { union abc *ptr; // pointer variable declaration union abc var; var.a= 90; ptr = &var; printf('The value of a is : %d', ptr->a); return 0; } 

위의 코드에서는 var 변수의 주소를 저장하는 포인터 변수(*ptr)를 만들었습니다. 이제 ptr은 (->) 연산자를 사용하여 변수 'a'에 액세스할 수 있습니다. 따라서 위 코드의 출력은 90이 됩니다.

연결리스트 자바

C 노동조합이 필요한 이유는 무엇입니까?

C 공용체의 필요성을 이해하려면 한 가지 예를 고려하십시오. 두 가지 품목이 있는 상점을 생각해 보겠습니다.

  • 서적
  • 셔츠

상점 주인은 위의 두 항목에 대한 기록을 관련 정보와 함께 저장하고 싶어합니다. 예를 들어 책에는 제목, 저자, 페이지 수, 가격이 포함되고 셔츠에는 색상, 디자인, 크기 및 가격이 포함됩니다. '가격' 속성은 두 항목 모두에서 공통입니다. 상점 소유자는 속성을 저장하고 기록을 저장하는 방법을 원합니다.

처음에 그들은 아래와 같은 구조로 레코드를 저장하기로 결정했습니다.

 struct store { double price; char *title; char *author; int number_pages; int color; int size; char *design; }; 

위의 구조는 점주가 보관하고 싶은 모든 품목으로 구성됩니다. 위의 구조는 완전히 사용 가능하지만 가격은 두 항목 모두 공통 속성이고 나머지 항목은 개별적입니다. 가격, *제목, *저자, 번호_페이지 등의 속성은 Books에 속하고, 색상, 크기, *디자인은 Shirt에 속합니다.

구조체의 멤버에 어떻게 접근할 수 있는지 살펴보겠습니다. .

과일이 몇 개 있어요?
 int main() { struct store book; book.title = 'C programming'; book.author = 'Paulo Cohelo'; book.number_pages = 190; book.price = 205; printf('Size is : %ld bytes', sizeof(book)); return 0; } 

위의 코드에서는 유형의 변수를 만들었습니다. 가게 . 변수인 제목, 저자, 번호_페이지, 가격에 값을 할당했지만 책 변수에는 크기, 색상, 디자인과 같은 속성이 없습니다. 그러므로 그것은 기억의 낭비이다. 위 구조의 크기는 44바이트입니다.

공용체를 사용하면 많은 공간을 절약할 수 있습니다.

 #include struct store { double price; union { struct{ char *title; char *author; int number_pages; } book; struct { int color; int size; char *design; } shirt; }item; }; int main() { struct store s; s.item.book.title = 'C programming'; s.item.book.author = 'John'; s.item.book.number_pages = 189; printf('Size is %ld', sizeof(s)); return 0; } 

위의 코드에서는 store 유형의 변수를 만들었습니다. 위 코드에서는 공용체를 사용했기 때문에 변수가 차지하는 가장 큰 메모리가 메모리 할당에 고려됩니다. 위 프로그램의 출력은 32바이트입니다. 구조체의 경우 44바이트를 얻었고, 공용체의 경우 얻은 크기는 44바이트입니다. 따라서 44바이트는 32바이트보다 크므로 메모리 공간이 많이 절약됩니다.