logo

Związki C

Unia to typ danych zdefiniowany przez użytkownika w języku C, który może zawierać elementy różnych typów danych, podobnie jak struktura. Jednak w przeciwieństwie do struktur, wszystkie elementy unii C są przechowywane w tym samym miejscu pamięci. Dzięki temu tylko jeden członek może przechowywać dane w danej instancji.

związki-w-c

Składnia Unii w C

Składnię unii w C można podzielić na trzy etapy, które są następujące:



C Deklaracja Unii

W tej części deklarujemy jedynie szablon związku, czyli deklarujemy jedynie nazwy członków i typy danych wraz z nazwą związku. W deklaracji do unii nie przydzielono pamięci.

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

Należy pamiętać, że deklarację unii zawsze musimy zakończyć średnikiem.

Różne sposoby definiowania zmiennej unijnej

Musimy zdefiniować zmienną typu union, aby rozpocząć korzystanie z elementów unii. Istnieją dwie metody, za pomocą których możemy zdefiniować zmienną unijną.



  1. Z Deklaracją Unii
  2. Po Deklaracji Unii

1. Definiowanie zmiennej sumującej z deklaracją

 union union_name { datatype member1; datatype member2; ... } var1, var2, ...;>

2. Definiowanie zmiennej unijnej po deklaracji

 union union_name var1, var2, var3 ...;>

Gdzie nazwa_związku to nazwa już zadeklarowanego związku.

Dostęp do członków związku

Dostęp do członków związku możemy uzyskać za pomocą operatora kropki ( . ), podobnie jak w przypadku struktur.

 var1.member1 ;>

Gdzie zm.1 jest zmienna unijna I członek 1 jest członek związku .



Powyższa metoda dostępu do członków związku działa również w przypadku związków zagnieżdżonych.

 var1.member1.memberA;>

Tutaj,

  • zm.1 jest zmienną unijną.
  • członek 1 jest członkiem związku.
  • członekA jest członkiem Member1.

Inicjalizacja Unii w C

Inicjalizacja unii polega na inicjalizacji jej członków poprzez proste przypisanie im wartości.

 var1.member1 = some_value ;>

Należy tu zwrócić uwagę na jedną ważną rzecz tylko jeden element może zawierać pewną wartość w danym momencie.

Przykład Unii

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;> }>

>

>

Wyjście

The value stored in member1 = 15>

Wielkość Unii

Rozmiar unii będzie zawsze równy rozmiarowi największego elementu tablicy. Wszystkie mniejsze elementy mogą przechowywać dane w tej samej przestrzeni bez żadnego przepełnienia.

alokacja pamięci w unii c

Alokacja pamięci w C Union

Przykład 1: Program w C służący do obliczania rozmiaru związku

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;> }>

>

>

liczba całkowita podwójna Java
Wyjście

Sizeof test1: 4 Sizeof test2: 4 Sizeof test3: 40>

Różnica między strukturą C a Unią C

W poniższej tabeli wymieniono kluczowe różnice między strukturą a unią w C:

Struktura Unia
Rozmiar struktury jest równy lub większy niż całkowity rozmiar wszystkich jej elementów. Wielkość związku jest wielkością jego największego członka.
Struktura może zawierać dane w wielu elementach jednocześnie. Tylko jeden element może zawierać dane w tym samym czasie.
Deklaruje się ją za pomocą słowa kluczowego struct. Deklaruje się go za pomocą słowa kluczowego union.

Często zadawane pytania dotyczące związków C

1. Jaka jest wielkość danego związku?

union un { int a; int arr[20]; }>

Odpowiedź: Rozmiar danej unii wynosi 20 x 4 bajty = 80 bajtów. Nawet jeśli tablica jest zbiorem podobnych elementów danych, kompilator C uważa ją za pojedynczą jednostkę.

2. Czy możemy przechowywać dane u wielu członków związku jednocześnie?

Nie. Możemy przechowywać dane tylko u jednego członka w tym samym czasie. Na przykład w poniższym programie C zarówno x, jak i y mają tę samą lokalizację. Jeśli zmienimy x, zobaczymy, że zmiany znajdują odzwierciedlenie w y.

C




konwencja nazewnictwa dla Java
// 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;> }>

>

>

Wyjście

After making x = 2: x = 2, y = 2 After making y = 10: x = 10, y = 10>

3. Jakie są zastosowania związków zawodowych?

Unie mogą być przydatne w wielu sytuacjach, gdy chcemy używać tej samej pamięci dla dwóch lub więcej członków. Załóżmy na przykład, że chcemy zaimplementować binarną strukturę danych w postaci drzewa, w której każdy węzeł-liść ma podwójną wartość danych, podczas gdy każdy węzeł wewnętrzny ma wskaźniki do dwójki dzieci, ale nie ma danych. Jeśli zadeklarujemy to jako:

C




struct> NODE {> >struct> NODE* left;> >struct> NODE* right;> >double> data;> };>

>

>

wówczas każdy węzeł wymaga 16 bajtów, a połowa bajtów jest marnowana na każdy typ węzła. Z drugiej strony, jeśli zadeklarujemy węzeł w następujący sposób, możemy zaoszczędzić miejsce.

C




struct> NODE {> >bool> is_leaf;> >union> {> >struct> {> >struct> NODE* left;> >struct> NODE* right;> >} internal;> >double> data;> >} info;> };>

>

>