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