Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив WinRAR / 2_Посібник_С_002.doc
Скачиваний:
39
Добавлен:
17.05.2015
Размер:
2.7 Mб
Скачать

7.3 Об’єднання

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

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

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

{

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

};

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

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

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

#include <stdio.h>

#include <stdlib.h>

unionun

{

int ivar;

int* pivar;

charpstr[8];

floatfvar;

long intlivar;

};

structst

{

intivar;

int* pivar;

charpstr[8];

floatfvar;

long intlivar;

};

intmain(void)

{

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

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

system("pause");

return 0;

}

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

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

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

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

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

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

#include <stdio.h>

#include <stdlib.h>

unionun

{

int ivar;

charpstr[8];

};

intmain(void)

{

unionun 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;

}

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

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

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

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

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

#include <stdio.h>

#include <stdlib.h>

uniondig

{

struct

{

intdigit0;

intdigit1;

intdigit2;

intdigit3;

} digits;

intdigit[4];

};

intmain(void)

{

uniondig data;

inti;

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;

}

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

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

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

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

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

{

intivar;

charpstr[8];

};

voidfunc(void)

{

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

функції func */

{

int ivar;

char pstr[8];

float fvar;

};

/* ... */

}

/* ... */

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

Соседние файлы в папке Архив WinRAR