Związki C

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

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




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