Об’єднання — це визначений користувачем тип даних мовою C, який може містити елементи різних типів даних, як і структура. Але на відміну від структур, усі члени об’єднання C зберігаються в одному місці пам’яті. Через це лише один учасник може зберігати дані в даному екземплярі.

Синтаксис Union у C
Синтаксис об’єднання в C можна розділити на три кроки, які є такими:
С Союзна декларація
У цій частині ми лише оголошуємо шаблон об’єднання, тобто ми оголошуємо лише імена членів і типи даних разом із назвою об’єднання. Об’єднанню в декларації не виділяється пам’ять.
union union_name { datatype member1 ; datatype member2 ; ... };>
Майте на увазі, що ми завжди маємо закінчувати декларацію об’єднання крапкою з комою.
Різні способи визначення змінної Union
Нам потрібно визначити змінну типу union, щоб почати використовувати union members. Існує два методи, за допомогою яких ми можемо визначити змінну об’єднання.
- З Союзною декларацією
- Після Союзної декларації
1. Визначення змінної Union з оголошенням
union union_name { datatype member1; datatype member2; ... } var1, var2, ...;>
2. Визначення змінної Union після оголошення
union union_name var1, var2, var3 ...;>
де union_name це назва вже оголошеного союзу.
Доступ до членів профспілки
Ми можемо отримати доступ до членів об’єднання за допомогою оператора крапки ( . ), як і до структур.
var1.member1 ;>
де var1 є змінна об'єднання і член1 є член спілки .
Наведений вище спосіб доступу до членів об’єднання також працює для вкладених об’єднань.
var1.member1.memberA;>
тут,
- var1 є змінною об’єднання.
- член1 є членом спілки.
- членА є членом member1.
Ініціалізація Union у C
Ініціалізація об'єднання - це ініціалізація його членів шляхом простого присвоєння їм значення.
var1.member1 = some_value ;>
Важливо відзначити одну річ лише один член може містити певне значення в даний момент часу.
Приклад Союзу
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;> }> |
>
>Вихід
The value stored in member1 = 15>
Розмір Союзу
Розмір об'єднання завжди дорівнюватиме розміру найбільшого члена масиву. Усі елементи меншого розміру можуть зберігати дані в одному просторі без переповнення.

Розподіл пам'яті в C Union
Приклад 1: програма на C для визначення розміру об’єднання
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;> }> |
>
>
спробуйте блок catch у javaВихід
Sizeof test1: 4 Sizeof test2: 4 Sizeof test3: 40>
Різниця між C Structure та C Union
У наступній таблиці перелічено ключові відмінності між структурою та об’єднанням у C:
Структура | Союз |
---|---|
Розмір конструкції дорівнює або перевищує загальний розмір усіх її елементів. | Розмір профспілки дорівнює розміру її найбільшого члена. |
Структура може містити дані в кількох членах одночасно. | Тільки один член може містити дані одночасно. |
Він оголошується за допомогою ключового слова struct. | Він оголошується за допомогою ключового слова union. |
Поширені запитання щодо C Unions
1. Який розмір даного союзу?
union un { int a; int arr[20]; }>
Відповідь: розмір даного об’єднання становить 20 x 4 байти = 80 байтів. Навіть якщо масив є набором подібних елементів даних, компілятор C розглядає його як одну сутність.
2. Чи можемо ми зберігати дані кількох членів профспілки одночасно?
Ні. Ми можемо зберігати дані лише в одному члені одночасно. Наприклад, у наведеній нижче програмі на C і x, і y мають одне й те саме розташування. Якщо ми змінимо x, ми побачимо, що зміни відображаються на 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;> }> |
>
>Вихід
After making x = 2: x = 2, y = 2 After making y = 10: x = 10, y = 10>
3. Яке застосування спілок?
Об’єднання можуть бути корисними в багатьох ситуаціях, коли ми хочемо використовувати ту саму пам’ять для двох або більше учасників. Наприклад, припустімо, що ми хочемо реалізувати структуру даних бінарного дерева, де кожен листовий вузол має подвійне значення даних, тоді як кожен внутрішній вузол має покажчики на двох дочірніх вузлів, але не має даних. Якщо ми оголосимо це як:
C
приклад java, привіт, світ
struct> NODE {> > struct> NODE* left;> > struct> NODE* right;> > double> data;> };> |
>
>
тоді кожен вузол потребує 16 байтів, при цьому половина байтів витрачається марно для кожного типу вузла. З іншого боку, якщо ми оголосимо вузол таким чином, ми зможемо заощадити місце.
C
struct> NODE {> > bool> is_leaf;> > union> {> > struct> {> > struct> NODE* left;> > struct> NODE* right;> > } internal;> > double> data;> > } info;> };> |
>
>