6.2  Объединения

Объединения являются производными типами, разделяющими многие синтаксические и функциональные свойства типов структур. Главное различие между ними состоит в том, что объединение позволяет быть «активным» одновременно только одному компоненту. Размер объединения равен, таким образом, размеру своего максимального компонента. Одновременно в памяти может находиться значение только одного компонента объединения. В следующем простом случае:

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, что неверно!

muh = ‘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.

Общий синтаксис объявления объединений во многом напоминает синтаксис объявления структур