Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Об'єднання | Розуміння Структур і Пам'яті
Структури в C
Секція 3. Розділ 3
single

single

Об'єднання

Свайпніть щоб показати меню

Note
Визначення

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

Юніони використовуються рідко, але вони корисні, коли потрібно, щоб змінна могла зберігати різні типи даних у різний час з економією пам'яті.

Дані розташовані в одній і тій самій області пам'яті для всіх членів union. Це означає, що всі члени union мають одну й ту саму адресу пам'яті, а розмір union дорівнює розміру його найбільшого члена.

struct+vs+union

Основне призначення union — накладання різних типів даних на одну спільну область пам'яті, тобто представлення однієї області пам'яті як різних типів даних.

Оскільки в union поля знаходяться в одній комірці пам'яті, можна обробляти одні й ті самі дані різними способами:

main.c

main.c

12345678910111213141516
#include <stdio.h> // declaring a union union Data { int a; char b; } data; int main() { data.a = 77; // assigning a value to variable a printf("Value of data.a: %d\n", data.a); printf("Value of data.b: %c\n", data.b); return 0; }

У цьому прикладі змінні data.a та data.b використовують одну й ту саму пам'ять. Ми присвоїли значення 77 полю a, але можемо інтерпретувати ті ж байти як символ у полі b.

Вирівнювання в об'єднаннях

Як і структури, об'єднання також використовують вирівнювання та заповнення. Компілятор може додавати додаткові байти, щоб кожен член починався з відповідної межі пам'яті.

main.c

main.c

12345678910111213
#include <stdio.h> union Data { int a; // 4 bytes double b; // 8 bytes char c[20]; // 20 bytes }; int main() { printf("Size of union Data: %zu bytes\n", sizeof(union Data)); return 0; }

Об'єднання може зберігати лише одне значення одночасно, а його розмір дорівнює розміру найбільшого члена. У прикладі з int a (4 байти), double b (8 байт) та char c[20] мінімальний розмір об'єднання становить 20 байт. Однак компілятор може додати додаткові байти для вирівнювання, щоб double або int починалися з відповідної межі пам'яті. У результаті sizeof(union Data) може бути більшим за 20, наприклад, 24 байти.

Завдання

Проведіть, щоб почати кодувати

Юніон Data зберігає кожне значення як int і дозволяє доступ до того ж значення як до char. Функція повинна проходити по масиву та виводити кожне значення як values і як відповідний ASCII-символ.

Функція приймає два параметри: масив цілих чисел (n) і його довжину (union Data).

  1. Використати int a з двома членами: char b та for.
  2. У 0 циклі пройти по елементах масиву від n до int.
  3. Присвоїти поточний елемент масиву цілочисельному члену юніону (data.a).
  4. Вивести цілочисельне значення data.a та символьне представлення data.b.

Приклад

{65, 66, 67, 68, 69} =>

Value as int: 65, Value as char: A
Value as int: 66, Value as char: B
Value as int: 67, Value as char: C
Value as int: 68, Value as char: D
Value as int: 69, Value as char: E

Рішення

Switch to desktopПерейдіть на комп'ютер для реальної практикиПродовжуйте з того місця, де ви зупинились, використовуючи один з наведених нижче варіантів
Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 3
single

single

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

some-alt