Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга6.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.45 Mб
Скачать

9.4 Об’єднання

Об’єднання (union) – сукупність зв’язаних даних різних типів, для зберігання яких у пам’яті ЕОМ використовуються спільні комірки.

Синтаксис визначення об’єднання:

union <назва об’єднання>

{

<опис елементів>

};

Об'єднання використовуються коли необхідно отримати доступ до одних і тих же даних різними способами, або для економії пам’яті ЕОМ у випадку коли виключена можливість одночасного використання різних елементів об’єднання.

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

Приклад 9.15. Порівняння розмірів об’єднання і структури.

#include <stdio.h>

#include <stdlib.h>

union un

{

int ivar;

int * pivar;

char pstr[8];

float fvar;

long int livar;

};

struct st

{

int ivar;

int* pivar;

char pstr[8];

float fvar;

long int livar;

};

int main(void)

{

printf("Union size:\t%d\n", sizeof(union un));

printf("Struct size:\t%d\n", sizeof(struct st));

system("pause");

return 0;

}

Результат роботи програми:

Як бачимо з програмного коду прикладу 9.15, найбільший розмір і у структурі і у об’єднанні займає елемент pstr[8] (8 байт). У випадку об’єднання розмір цього елементу і визначає розмір змінної типу об’єднання.

Синтаксично робота зі змінними типу об’єднання аналогічна роботі зі змінними типу структур. Але синтаксис опису змінних типу об’єднання відрізняється:

union <назва об’єднання> < ім’я змінної>;

Як і у випадку зі структурами, використання ключового слова union є обов’язковим. Також дозволяється описувати змінні типу об’єднання одразу після визначення об’єднання.

Приклад 9.16. Робота з об’єднаннями.

#include <stdio.h>

#include <stdlib.h>

union un

{

int ivar;

char pstr[8];

};

int main(void)

{

union un un_var;

un_var.ivar = 0;

printf("un_var.ivar=%d\n",un_var.ivar);

printf("un_var.pstr>> ");

scanf("%s", un_var.pstr);

printf("un_var.ivar=%d\n", un_var.ivar);

printf("un_var.ivar>> ");

scanf("%d", &un_var.ivar);

printf("un_var.pstr=%s\n", un_var.pstr);

system("PAUSE");

return 0;

}

Результат роботи програми:

Приклад 9.16 демонструє спільне використання однієї області пам’яті декількома різними об’єктами об’єднання. Графічне представлення образу змінної un_var у пам’яті показано на рисунку 9.2.

Рисунок 9.2 Змінна типу об’єднання у пам’яті.

Подібне використання пам’яті, окрім її економії, надає змогу зручного доступу до однакових даних різними способами, а також дозволяє проводити нестандартні приведення типів даних.

Приклад 9.17. Приклад організації доступу до однієї області пам’яті різними способами за допомогою об’єднань.

#include <stdio.h>

#include <stdlib.h>

union dig

{

struct

{

int digit0;

int digit1;

int digit2;

int digit3;

} digits;

int digit[4];

};

int main(void)

{

union dig data;

int i;

printf("Vvedit' 4 chisla>> \n");

scanf("%d", &data.digits.digit0);

scanf("%d", &data.digits.digit1);

scanf("%d", &data.digits.digit2);

scanf("%d", &data.digits.digit3);

printf("Vi vvely taki chisla:\n");

for(i=0; i<4; i++)

printf("\t%d) %d\n", i+1, data.digit[i]);

system("PAUSE");

return 0;

}

Результат роботи програми:

Об’єднання, аналогічно структурам, можуть бути неіменованими. Такі об’єднання називаються анонімними.

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

Приклад 9.18. Області видимості визначень об’єднань.

union un /* Глобально-видиме визначення */

{

int ivar;

char pstr[8];

};

void func(void)

{

union un; /* Визначення, яке видиме тільки в межах

функції func */

{

int ivar;

char pstr[8];

float fvar;

};

}

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]