Объединение в языке С связано с математическим понятием объединения множеств.
Например, мы можем объединить множество целых чисел `ZZ` и множество символов `CC`:\
`A = ZZ cup CC`
Значение `a in A` может быть либо целым числом, либо символом, но не одновременно. Для хранения значения такого типа достаточно использовать ``max(sizeof(int),sizeof(char))`` байт памяти,
но нужно где-то хранить информацию, из какого множества используется значение.
Объявление типа для объединения похоже на объявление типа для структуры, и рекомендуется объявить перечисление для переменной, хранящей информацию о варианте. Обращение к нужному варианту значения выглядит как обращение к полю структуры.
Значение, указанное в списке инициализации, всегда используется для первого варианта, но можно явно указать имя варианта через ` tt"." "имя_варианта" ="выражение"`
```run-c
#include <stdio.h>
typedef union {
long i;
char c;
struct { double x, y; } point;
} unionA;
typedef enum { isLONG, isCHAR, isPOINT } tipA;
int main() {
unionA a={-1}; // значение типа long
tipA ta=isINT; // текущий тип a, попробуйте изменить на isPOINT
switch(ta) {
case isLONG: printf("%ld\n", a.i);
break;
case isCHAR: printf("%c\n", a.c);
break;
case isPOINT: printf("%lf %lf\n", a.point.x, a.point.y);
}
}
```
Чаще всего объединение и переменная для текущего типа хранятся как два поля в одной структуре.
Так как возможны ошибки обращения к неправильному варианту текущего значения, то вместо объединений лучше использовать обычные структуры, если требования к памяти не являются критическими.