Объединение — объект, который в каждый момент времени содержит один из нескольких элементов различных типов.
Все компоненты объявления структур, такие как шаблоны, имена типа, имена элементов и т.д. применимы и при объявлении объединений. Единственное отличие состоит в том, что при объявлении объединения вместо ключевого слова struct используется union.
Примечание 1
Объединение не может иметь битовые поля.
Операции доступа к элементу структуры (операция . и операция ->) могут применяться и к объединениям. Допустимы массивы объединений и указатели на объединения. Объединения могут передаваться функции как параметры и возвращаться функцией.
Пример 1
struct s_tag{
            char c;
            int i;
            doubl d;
            } s_item;
Рис. 1.  Структура
Пример 2
union u_tag{
           char c;
           int i;
           doubl d;
           } u_item;
Рис. 2.  Объединение
В отличие от структуры, объединение может в любой момент времени содержать только один из своих элементов. Объединение позволяет использовать одну область памяти для хранения различных видов данных в разные моменты времени. Фактически, объединение — это структура, в которой все поля начинаются со смещением 0, таким образом, поля накладываются друг на друга.
Пример 3
printf("размер структуры = %d\n", sizeof(s_item));
printf("размер объединения = %d\n", sizeof(u_item));
Вывод:
размер структуры = 16
размер объединения = 8
Объединения часто включаются в структуры, один из элементов которых является ключом, указывающим тип хранимого в памяти элемента объединения.
Пример 4
/* содержит информацию о работающих служащих и пенсионерах */
struct mail {
            char id;      /* a - active (), r - retired()*/
            union{
                 struct{char name[30];
                        char dept[10];
                        char location[3];
                        } active;
                 struct{char name[30];
                        char street[20];
                        char city_state[3];
                        char zip[5];
                        } retired;
                 } info;
             } preson;
Структура типа struct mail используется для хранения почтового адреса работающего служащего или пенсионера. При заполнении структуры этого типа информацией в нее заносится порция данных, соответствующая элементам active или retired объединения info. Поле id устанавливается равным 'a' или 'r' для указания фактически записанного в объединении элемента. При применении объединения используется меньше памяти, чем в случае применения структуры, которая имела бы идентичные поля, но некоторые из них не использовались бы.

Рис. 3.  Объединение как элемент структуры