Объединение – это структура, все элементы которой имеют нулевое смещение, а сама структура достаточно велика, чтобы вместить самый большой элемент, и выровнена так, чтобы можно было работать с любым элементом. Объявляется объединение, как и структура, но с ключевым словом union. Это объявление не задает какую- либо переменную, а определяет лишь шаблон.
union <имя структуры>{<тип 1> <имя 1>;
<тип 2> <имя 2>;
<тип N> <имя N> ;
}
Для объявления переменной записывается:
union <имя структуры> <имя переменной>;
В объединении не допускаются элементы типа полей битов.
Можно объявлять переменные одновременно с заданием шаблона.
Пример:
| а) union u { int i;
char c;
long l;
} a, *р ;
| б) struct s { int i;
char c;
long l ;
} b;
|
Для переменной типа union места в памяти выделяется столько, сколько надо элементу объединения, имеющему наибольший размер в памяти. Остальные переменные будут располагаться в том же месте памяти, начиная с одного и того же адреса (с наложением).
При инициализации объединения задается значение первого элемента в соответствии с его типом. Например,
union u { char name [10];
int t;
} u1=²Утро²;
Объединения могут входить в структуры и массивы и наоборот. Ссылки на объединения можно использовать как и ссылки на структуры. Объединения обычно применяются для экономии памяти и в случаях, когда надо выделить часть целой переменной или загрузить целое значение в структуру, описанную полями битов.
Пример использования полей битов и объединений.
#include <stdio.h>
#include <conio.h>
struct byte
{
unsigned b1:1;
unsigned b2:1; // целое без знака
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
unsigned b8:1;
}; //Определена структура битовое поле
union bits {
char ch;
struct byte b;
} u;
void decode(union bits b); // Прототип функции
void main()
{
do { u.ch=getche();
printf(": ");
decode(u);
} while (u.ch!='q'); // цикл повторять, пока не будет
} // введен символ "q"
void decode(union bits p) // функция
{
printf("%d%d%d%d%d%d%d%d",p.b.b8,p.b.b7,p.b.b6,
p.b.b5, p.b.b4,p.b.b3,p.b.b2,p.b.b1);
printf("\n");
}