Смесь (объединение) – это разновидность структуры, позволяющей нескольким переменным различных типов занимать один участок памяти (в разное время). В результате появляется возможность работы в одной и той же области памяти с данными различного вида. Для описания смеси используется ключевое слово union, а соответствующий синтаксис аналогичен синтаксису структуры.
Пусть задано объявление
union r { int ir; float fr; char cr; } Z;
Здесь ir имеет размер 2 байта
fr имеет 4 байта
cr имеет 1 байт
Для Z будет выделена память достаточная, чтобы сохранять самый большой из 3-х приведенных типов. Т.о. размер Z будет 4 байта. В один и тот же момент времени в z может иметь значение только одно из (ir, fr, cr).
Пример:
# include <stdio.h>
union r { int ir; float fr; char cr; } Z;
float f;
/* объявлена смесь Z типа r. Размер смеси будет определяться размером самого длинного элемента. В данном случае fr * /
void main (void)
{
/* В версии Borland С++3.1 обнаружена ошибка при использовании вычисления и функции вывода вещественных значений элементов структур. Чтобы обойти ошибку, присваиваем вещественное значение элемента union простой вещественной переменной f (f=Z.fr;), а затем используем f в выражениях и наоборот * /
printf ( " размер Z = % d байта \ n", sizeof (z) );
/* sizeof(Z) вычисляет длину переменной Z. Соответственно printf распечатывает вычисленную длину * /
printf ("ввод Z.ir \ n");
scant (" % d", & Z.ir);
printf ("значение ir = % d \n", Z.ir);
printf ("введите Z.fr \ n");
scanf (" % f", & f);
Z.fr = f;
/* Фактически запись в Z.fr (что фактически реализован ввод (scanf (" % f", &Z.ir); )*/
printf (" значение fr = % f \ n"; f);
printf (" введите Z.cr \ n");
flushall ();
/* Очистка буферов ввода - вывода. Такая очистка здесь необходима, т.к. в буфере ввода остается символ конца строки от предыдущего ввода, который затем введется спецификацией %с вместо реально набираемого символа.*/
scanf (" % C", & Z.cr);
printf (" значение cr = % C; \ n", Z.cr);
}
Пример:
размер Z = 4 байта
ввод Z.ir
7 <─┐
значение ir = 7
ввод : Z.fr
8. 3 4 5 6 7 8 <─┐
введите Z.cr
p
значение сr = p;