Еще одним агрегирующим типом данных в языке С являются объединения, которые вводятся при помощи служебного слова union.
Объединение – это переменная, которая может содержать (в разное время) объекты различных типов и размеров.
Объединение можно рассматривать как структуру, все элементы которой имеют нулевое смещение от начала. При таком размещении разные элементы занимают в памяти один и тот же участок. Тем самым объединения обеспечивают возможность доступа к одному и тому же участку памяти с помощью переменных разного типа.
Цель введения в программу объединения – иметь переменную, которая хранила бы в себе значения нескольких типов.
Для обращения к элементу объединения используются те же конструкции, что и для обращения к элементу структуры:
<имя объединения>.<имя элемента>
(*<указатель на объединение>).<имя элемента >
< указатель на объединение > -> < имя элемента >
Как и данные других типов, объединение – это конкретный объект, которому выделено место в памяти. В качестве элементов объединения могут выступать не только отдельные переменные, но и массивы или структуры. Размеры участка памяти, выделяемого под объединение, определяются по размеру самого большого элемента объединения.
Определение объединений осуществляется точно так же, как и структур
typedef union REG {
unsigned char Byte[2];
unsigned short Word;
} REGISTR;
REG – имя объединяющего типа;
REGISTR – обозначение объединяющего типа;
Использование объединений позволяет создавать машинно-независимый код. Поскольку компилятор отслеживает настоящие размеры переменных, образующих объединение, уменьшается зависимость от компьютера. Не нужно беспокоиться о размере целых или вещественных чисел, символов или чего-либо еще.
Объединения часто используются при необходимости преобразования типов, поскольку можно обращаться к данным, хранящимся в объединении, совершенно различными способами.
Если для хранения типа текущего значения u использовать переменную utype, то
if (utype == INT)
printf(“%d\n”, u.ival);
else if(utype == FLOAT)
printf(“%f\n”, u.fval);
else if(utype == STRING)
printf(“%s\n”, u.sval);
else
printf(“неверный тип %d в utype\n”, utype);
Инициализировать объединение можно только значением, имеющим тип его первого члена. Упомянутую выше переменную u можно инициализировать только значением типа int.