Учебники

C — Союзы

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

Определение союза

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

union [union tag] {
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];  

Тег объединения является необязательным, и каждое определение члена является обычным определением переменной, например int i; или плавать f; или любое другое допустимое определение переменной. В конце определения объединения перед последней точкой с запятой вы можете указать одну или несколько переменных объединения, но это необязательно. Вот как вы можете определить тип объединения с именем Data, имеющий три члена i, f и str.

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

Теперь переменная типа Data может хранить целое число, число с плавающей точкой или строку символов. Это означает, что одна переменная, т. Е. Одна и та же ячейка памяти, может использоваться для хранения нескольких типов данных. Вы можете использовать любые встроенные или определенные пользователем типы данных внутри объединения в зависимости от ваших требований.

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

Live Demo

#include <stdio.h>
#include <string.h>
 
union Data {
   int i;
   float f;
   char str[20];
};
 
int main( ) {

   union Data data;        

   printf( "Memory size occupied by data : %d\n", sizeof(data));

   return 0;
}

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

Memory size occupied by data : 20

Доступ к членам Союза

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

Live Demo

#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 Programming");

   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 печатается очень хорошо.

Теперь давайте снова посмотрим на тот же пример, где мы будем использовать одну переменную за раз, что является основной целью создания объединений —

Live Demo

#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 Programming");
   printf( "data.str : %s\n", data.str);

   return 0;
}

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

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

Здесь все участники печатаются очень хорошо, потому что один член используется за один раз.