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.
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ą.
- Z Deklaracją Unii
- 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 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 JavaWyjś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;> };> |
>
>