====== объединения ======
Объединения (union) позволяют определить свой тип данных и хранят набор элементов, но в отличие от структуры все элементы объединения имеют нулевое смещение. Это значит, что разные элементы занимают в памяти один и тот же участок, то есть в памяти они накладываются друг на друга.
определение
union ascii {
int digit;
char letter;
};
{{:c:c_ultimate_guide:union.png}}
Длина элементов может быть разной, в этом случае размер объединения вычисляется по __наибольшему__ элементу.
При определении переменной объединения мы ее можем сразу инициализировать, но стоит учитывать, что инициализировать мы можем только первый элемент объединения. В данном случае это элемент digit типа int, поэтому мы можем передать ему только целое число:
union ascii code = {120};
Стоит отметить, что, так как оба элемента - letter и digit занимают одну и ту же память, то данные фактически одни и те же, только при обращении к code.digit данные интерпретируются как объект int, а при обращении к code.letter - как объект char.
Объединения синтаксически сохожи с struct и enum и могут быть анонимными или иметь псевдонимы.
// псевдоним объединения
typedef union ascii {
int digit;
char letter;
} ascii_code;
// псевдоним анонимного объединения
typedef union{
int digit;
char letter;
} ascii_code;