Объединения
union memo
{
long ll;
int ii[2];
char cc[4];
int xx;
} MEM;
Назначение объединения заключается не в экономии памяти, как может показаться на первый взгляд. На самом деле оно является одним из инструментов управления памятью на принципах, принятых в Си. Ниже (в 4.4) мы увидим, как использование указателей различных типов позволяет реализовать эти принципы. Здесь же, не вдаваясь в подробности, отметим одно важное свойство: если записать в один элемент объединения некоторое значение, то через другой элемент это же значение можно прочитать уже в другой форме представления (как переменную другого типа). То есть форму представления данных в памяти можно менять совершенно свободно.
.
char z;
// 3 2 1 0
// -¬-¬-¬-¬ Элемент ll размещается в MEM,
MEM.ll = 0x12345678; // начиная с младшего байта
z = MEM.cc[2]; // Второй байт в массиве байтов cc
// в MEM имеет значение 0x34
// Результат: z получает значение
// второго байта длинного целого
Естественно, что при таком манипулировании внутренним представлением данных, необходимо знать их форматы и размерность.