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

bookОб'єднання

Note
Визначення

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

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

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

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

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

main.c

main.c

copy
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

copy
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 байти.

Завдання

Swipe to start coding

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

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

  1. Використати union Data з двома членами: int a та char b.
  2. У циклі for ітеруватися по елементах масиву від 0 до n.
  3. Присвоїти поточний елемент масиву до члену int юніону (int).
  4. Вивести значення data.a як 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

Рішення

Все було зрозуміло?

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

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

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

single

Запитати АІ

expand

Запитати АІ

ChatGPT

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

close

bookОб'єднання

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

Note
Визначення

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

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

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

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

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

main.c

main.c

copy
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

copy
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 байти.

Завдання

Swipe to start coding

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

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

  1. Використати union Data з двома членами: int a та char b.
  2. У циклі for ітеруватися по елементах масиву від 0 до n.
  3. Присвоїти поточний елемент масиву до члену int юніону (int).
  4. Вивести значення data.a як 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

some-alt