logo

Союз в С

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

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

Давайте розберемося в цьому на прикладі.

 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 байти, що економить багато пам’яті.