объединения

Объединения (union) позволяют определить свой тип данных и хранят набор элементов, но в отличие от структуры все элементы объединения имеют нулевое смещение. Это значит, что разные элементы занимают в памяти один и тот же участок, то есть в памяти они накладываются друг на друга.

определение

union ascii {
  int digit;
  char letter;
};

Длина элементов может быть разной, в этом случае размер объединения вычисляется по наибольшему элементу.

При определении переменной объединения мы ее можем сразу инициализировать, но стоит учитывать, что инициализировать мы можем только первый элемент объединения. В данном случае это элемент 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;