C Объединения
Объединения— это специальный тип данных, который позволяет хранить различные типы данных в одной и той же области памяти. Вы можете определить объединение со многими членами, но только один член может иметь значение в любой момент времени. Объединения предоставляют эффективный способ использования одной и той же области памяти.
Определение объединения
Чтобы определить объединение, необходимо использоватьunionинструкцию, аналогично определению структуры. Инструкция union определяет новый тип данных с несколькими членами. Формат инструкции union следующий:
Тег unionнеобязателен. Определение каждого члена — это стандартное определение переменной, например int i; или float f; или другие допустимые определения переменных. В конце определения union, перед последней точкой с запятой, можно указать одну или несколько переменных union, что необязательно. Далее определяется тип union с именем Data с тремя членами i, f и str:
Теперь,DataПеременная этого типа может хранить целое число, число с плавающей запятой или строку. Это означает, что переменная (та же область памяти) может хранить несколько данных разных типов. При необходимости в объединении можно использовать любой встроенный или пользовательский тип данных.
Память, занимаемая объединением, должна быть достаточной для хранения самого большого члена объединения. Например, в приведённом выше примере Data займёт 20 байт памяти, потому что среди членов строка занимает наибольшее пространство. Следующий пример покажет общий размер памяти, занимаемой вышеуказанным объединением:
Пример
Когда приведённый выше код скомпилирован и выполнен, он выдаст следующие результаты:
Memory size occupied by data : 20
Доступ к членам объединения
Чтобы получить доступ к члену объединения, мы используемоператор доступа к членам (.). Оператор доступа к членам — это точка между именем переменной объединения и членом объединения, к которому мы хотим получить доступ. Вы можете использоватьunionключевое слово для определения переменных типа объединения. Следующий пример демонстрирует использование объединения:
Пример
Когда приведённый выше код скомпилирован и выполнен, он выдаст следующие результаты:
data.i : 1917853763 data.f : 4122360580327794860452759994368.000000 data.str : C Programming
Здесь мы можем увидеть, почему у объединенияiиfзначение члена повреждено, потому что значение, последним присвоенное переменной, занимает область памяти. Это такжеstrчлены могут быть выведены полностью и корректно. Теперь давайте рассмотрим другой аналогичный пример. На этот раз мы используем только одну переменную одновременно, что также демонстрирует основное назначение использования объединения:
Пример
Когда приведённый выше код скомпилирован и выполнен, он выдаст следующие результаты:
data.i : 10 data.f : 220.500000 data.str : C Programming
Здесь все члены могут быть выведены неповреждёнными, потому что одновременно используется только один член.
Другие расширения