Объединения являются производными типами, разделяющими многие синтаксические и функциональные свойства типов структур. Главное различие между ними состоит в том, что объединение позволяет быть «активным» одновременно только одному компоненту. Размер объединения равен, таким образом, размеру своего максимального компонента. Одновременно в памяти может находиться значение только одного компонента объединения. В следующем простом случае:
union myunion { /* тег объединения = myunion */
int i;
double d;
char ch;
} mu, *muptr=μ
идентификатор mu типа union myunion может быть использован для хранения 2(4)-байтового значения int, 8-байтового значения double или 1-байтового char, но одновременно – только одного из этих значений.
Обе операции sizeof(union myunion) и sizeof (mu) возвращают значение 8, но когда mu содержит объект типа int, то 6(4) байт остаются неиспользованными (туда помещаются символы-заполнители), а когда mu содержит объект типа char, то неиспользованными являются 7 байт. Доступ к компонентам объединения выполняется при помощи выбора компонента структуры (.) и (->), но требуется соблюдать осторожность. Например:
mu.d = 4.016;
printf("mu.d = %fln",mu.d);// напечатает mu.d = 4.016;
printf("mu.i = %dn",mu.i);// Формат double печатается как int, что неверно!
mu.сh = ‘A‘;
printf("mu.ch = %cn",mu.ch); // напечатает mu.ch = A;
printf("mu.d = %fln",mu.d); // Формат char печатается как double, что неверно!
muptr->i = 3;
printf("mu.i = %dn",mu.i); // напечатает mu.i = 3;
Второе предложение printf() допустимо, поскольку mu.i целочисленного типа. Однако целочисленная битовая комбинация в mu.i выбирает только биты, соответствующие типу int, из поля, в котором записаны биты формата double.
Общий синтаксис объявления объединений во многом напоминает синтаксис объявления структур