Союз може бути визначений як визначений користувачем тип даних, який є набором різних змінних різних типів даних в одному місці пам’яті. Об’єднання також можна визначити як багато членів, але лише один член може містити значення в певний момент часу.
Об’єднання — це визначений користувачем тип даних, але, на відміну від структур, вони спільно використовують одне місце в пам’яті.
Давайте розберемося в цьому на прикладі.
struct abc { int a; char b; }
Наведений вище код є визначеною користувачем структурою, яка складається з двох членів, тобто «a» типу внутр і 'b' типу характер . Коли ми перевірили адреси «a» і «b», ми виявили, що їхні адреси різні. Таким чином, ми робимо висновок, що члени структури не спільно використовують одне й те саме розташування пам’яті.
Коли ми визначили об’єднання, то виявили, що об’єднання визначається так само, як і структура, але різниця полягає в тому, що ключове слово union використовується для визначення типу даних union, тоді як ключове слово struct використовується для визначення структури. Об’єднання містить елементи даних, тобто «a» і «b». Коли ми перевіряємо адреси обох змінних, ми виявили, що обидві мають однакові адреси. Це означає, що члени об’єднання спільно використовують одне й те саме місце пам’яті.
Давайте подивимося на графічне представлення розподілу пам'яті.
На малюнку нижче показано графічне зображення конструкції. Структура складається з двох членів; тобто один має цілий тип, а інший – символьний. Оскільки 1 блок дорівнює 1 байту; отже, змінній 'a' буде виділено 4 блоки пам'яті, тоді як змінній 'b' буде виділено 1 блок пам'яті.
На малюнку нижче показано графічне зображення членів профспілки. Обидві змінні спільно використовують ту саму область пам’яті та мають однакову початкову адресу.
java перетворює рядок на ціле число
У об’єднанні учасники розділятимуть місце пам’яті. Якщо ми спробуємо внести зміни в будь-якого учасника, це також відобразиться на іншому учасникі. Давайте розберемо це поняття на прикладі.
union abc { int a; char b; }var; int main() { var.a = 66; printf(' a = %d', var.a); printf(' b = %d', var.b); }
У наведеному вище коді об’єднання має два члени, тобто «a» і «b». 'var' є змінною типу union abc. В головний() метод, ми присвоюємо 66 змінній 'a', тому var.a виведе 66 на екран. Оскільки «a» і «b» спільно використовують місце пам’яті, вар.б буде друкувати ' Б ' (код ascii 66).
Визначення розміру союзу
Розмір об’єднання залежить від розміру найбільшого члена об’єднання.
Розберемося на прикладі.
union abc{ int a; char b; float c; double d; }; int main() { printf('Size of union abc is %d', sizeof(union abc)); return 0; }
Як відомо, розмір int становить 4 байти, розмір char — 1 байт, розмір float — 4 байти, а розмір double — 8 байт. Оскільки змінна double займає найбільшу пам’ять серед усіх чотирьох змінних, тож у пам’яті буде виділено 8 байт. Таким чином, вихід вищезгаданої програми буде 8 байт.
Доступ до членів об'єднання за допомогою покажчиків
Ми можемо отримати доступ до членів об’єднання через покажчики за допомогою оператора стрілки (->).
Розберемося на прикладі.
#include union abc { int a; char b; }; int main() { union abc *ptr; // pointer variable declaration union abc var; var.a= 90; ptr = &var; printf('The value of a is : %d', ptr->a); return 0; }
У наведеному вище коді ми створили змінну-вказівник, тобто *ptr, яка зберігає адресу змінної var. Тепер ptr може отримати доступ до змінної 'a' за допомогою оператора (->). Таким чином, вихід коду вище буде 90.
Навіщо нам потрібні спілки C?
Розглянемо один приклад, щоб зрозуміти потребу в союзах C. Давайте розглянемо магазин, який має два предмети:
- Книги
- Сорочки
Власники магазинів хочуть зберігати записи двох вищезазначених товарів разом із відповідною інформацією. Наприклад, Книги містять назву, автора, кількість сторінок, ціну, а сорочки містять колір, дизайн, розмір і ціну. Властивість 'ціна' є спільною для обох елементів. Власник магазину хоче зберігати властивості, а потім, як він/вона зберігатиме записи.
Спочатку вони вирішили зберігати записи в структурі, як показано нижче:
struct store { double price; char *title; char *author; int number_pages; int color; int size; char *design; };
Наведена вище структура складається з усіх елементів, які хоче зберігати власник магазину. Наведена вище структура цілком придатна для використання, але ціна є спільною для обох елементів, а решта елементів є індивідуальними. Такі властивості, як price, *title, *author і number_pages, належать Books, тоді як color, size, *design належать Shirt.
Давайте подивимося, як ми можемо отримати доступ до членів структури .
int main() { struct store book; book.title = 'C programming'; book.author = 'Paulo Cohelo'; book.number_pages = 190; book.price = 205; printf('Size is : %ld bytes', sizeof(book)); return 0; }
У наведеному вище коді ми створили змінну типу зберігати . Ми присвоїли значення змінним, title, author, number_pages, price, але змінна book не має таких властивостей, як розмір, колір і дизайн. Отже, це марна трата пам'яті. Розмір наведеної вище структури буде 44 байти.
Ми можемо заощадити багато місця, якщо використовуємо союзи.
#include struct store { double price; union { struct{ char *title; char *author; int number_pages; } book; struct { int color; int size; char *design; } shirt; }item; }; int main() { struct store s; s.item.book.title = 'C programming'; s.item.book.author = 'John'; s.item.book.number_pages = 189; printf('Size is %ld', sizeof(s)); return 0; }
У наведеному вище коді ми створили змінну типу store. Оскільки ми використовували об’єднання у наведеному вище коді, то для виділення пам’яті розглядатиметься найбільша пам’ять, яку займає змінна. Вихід наведеної вище програми становить 32 байти. У випадку зі структурами ми отримали 44 байти, а у випадку з об’єднаннями – 44 байти. Отже, 44 байти більше, ніж 32 байти, що економить багато пам’яті.