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

Объединения— это специальный тип данных, который позволяет хранить различные типы данных в одной и той же области памяти. Вы можете определить объединение со многими членами, но только один член может иметь значение в любой момент времени. Объединения предоставляют эффективный способ использования одной и той же области памяти.

Определение объединения

Чтобы определить объединение, необходимо использоватьunionинструкцию, аналогично определению структуры. Инструкция union определяет новый тип данных с несколькими членами. Формат инструкции union следующий:

union [union tag] { member определение; член определение; ... член определение; } [один или больше объединение переменные];

Тег unionнеобязателен. Определение каждого члена — это стандартное определение переменной, например int i; или float f; или другие допустимые определения переменных. В конце определения union, перед последней точкой с запятой, можно указать одну или несколько переменных union, что необязательно. Далее определяется тип union с именем Data с тремя членами i, f и str:

union Data { int i; float f; char str[20]; } data;

Теперь,DataПеременная этого типа может хранить целое число, число с плавающей запятой или строку. Это означает, что переменная (та же область памяти) может хранить несколько данных разных типов. При необходимости в объединении можно использовать любой встроенный или пользовательский тип данных.

Память, занимаемая объединением, должна быть достаточной для хранения самого большого члена объединения. Например, в приведённом выше примере Data займёт 20 байт памяти, потому что среди членов строка занимает наибольшее пространство. Следующий пример покажет общий размер памяти, занимаемой вышеуказанным объединением:

Пример

#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; printf( "Размер памяти, занимаемой data : %d\n", sizeof(data)); return 0; }

Когда приведённый выше код скомпилирован и выполнен, он выдаст следующие результаты:

Memory size occupied by data : 20

Доступ к членам объединения

Чтобы получить доступ к члену объединения, мы используемоператор доступа к членам (.). Оператор доступа к членам — это точка между именем переменной объединения и членом объединения, к которому мы хотим получить доступ. Вы можете использоватьunionключевое слово для определения переменных типа объединения. Следующий пример демонстрирует использование объединения:

Пример

#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; data.i = 10; data.f = 220.5; strcpy( data.str, "Программирование на C"); printf( "data.i : %d\n", data.i); printf( "data.f : %f\n", data.f); printf( "data.str : %s\n", data.str); return 0; }

Когда приведённый выше код скомпилирован и выполнен, он выдаст следующие результаты:

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

Здесь мы можем увидеть, почему у объединенияiиfзначение члена повреждено, потому что значение, последним присвоенное переменной, занимает область памяти. Это такжеstrчлены могут быть выведены полностью и корректно. Теперь давайте рассмотрим другой аналогичный пример. На этот раз мы используем только одну переменную одновременно, что также демонстрирует основное назначение использования объединения:

Пример

#include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main( ) { union Data data; data.i = 10; printf( "data.i : %d\n", data.i); data.f = 220.5; printf( "data.f : %f\n", data.f); strcpy( data.str, "Программирование на C"); printf( "data.str : %s\n", data.str); return 0; }

Когда приведённый выше код скомпилирован и выполнен, он выдаст следующие результаты:

data.i : 10
data.f : 220.500000
data.str : C Programming

Здесь все члены могут быть выведены неповреждёнными, потому что одновременно используется только один член.

Другие расширения