Об'єднання, програмування на c і ​​c

union union_type int i; char ch;
>;

union union_type cnvt;

У cnvt як ціле число i, так і символ ch займають одну ділянку пам'яті. (Звичайно, i займає 2 або 4 байти, a ch - тільки 1.) Малюнок показує, як i і ch поділяють одну ділянку пам'яті (передбачається наявність 16-бітних цілих). Можна звернутися до даних, збереженим в cnvt, як до цілого числа, так і до символу.

Малюнок: Використання змінними i і cnvt, (розмір змінної цілого типу приймається рівним 16 бітам)

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

Для доступу до членів об'єднання використовується синтаксис, застосовуваний для доступу до структур - за допомогою операторів «точка» і «стрілка». Щоб працювати з об'єднанням безпосередньо, треба використовувати оператор «точка». Якщо до змінної об'єднання звернення відбувається за допомогою покажчика, треба використовувати оператор «стрілка». Наприклад, для присвоювання цілого числа 10 елементу i об'єднання cnvt слід написати:

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

Об'єднання часто використовуються при необхідності перетворення типів, оскільки можна звертатися до даних, що зберігаються в об'єднанні, абсолютно різними способами. Розглянемо проблему записи цілого числа в файл. У той час як можна писати будь-який тип даних (включаючи цілий) в файл за допомогою fwrite (), для даної операції використання fwrite () занадто «жирно». Використовуючи об'єднання, можна легко створити функцію, побайтно записує двійкове подання цілого у файл. Хоча існує кілька способів створення даної функції, є один спосіб виконання цього за допомогою об'єднання. В даному прикладі передбачається використання 16-бітових цілих. Об'єднання складається з одного цілого і двухбайтное масиву символів:

Об'єднання дозволяє здійснити доступ до двох байтів, що створює ціле, як до окремих символів. Тепер можна використовувати pw для створення функції write_int (), показаної в наступній програмі:

#include
#include
union pw int i;
char ch [2];
>;

int write_int (int num, FILE * fp);

int main ()
FILE * fp;
fp = fopen ( "test.tmp", "w +");

if (fp == NULL) printf ( "Can not open file. \ n");
exit (1);
>

write_int (1000, fp);
fclose (fp);
return 0;
>

/ * Висновок цілого за допомогою об'єднання * /

int write_int (int num, FILE * fp) union pw wrd;
wrd.i = num;
putс (wrd.ch [0], fp); / * Висновок першої половини * /
return putc (wrd.ch [1], fp); / * Висновок другої половини * /
>

Хоча write_int () викликається з цілим, вона використовує об'єднання для запису обох половинок цілого в дисковий файл побайтно.

Схожі статті