Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Об'єднання | Розуміння Структур і Пам'яті
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Опанування Структур у 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

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

Suggested prompts:

Can you explain more about how unions save memory compared to structs?

What are some practical examples where using a union is beneficial?

How does alignment and padding affect the size of a union?

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