C - Sindicatos

UNA uniones un tipo de datos especial disponible en C que permite almacenar diferentes tipos de datos en la misma ubicación de memoria. Puede definir una unión con muchos miembros, pero solo un miembro puede contener un valor en un momento dado. Las uniones proporcionan una forma eficiente de utilizar la misma ubicación de memoria para múltiples propósitos.

Definiendo una Unión

Para definir una unión, debe utilizar el uniondeclaración de la misma manera que lo hizo al definir una estructura. La declaración de unión define un nuevo tipo de datos con más de un miembro para su programa. El formato de la declaración de unión es el siguiente:

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

los union tages opcional y cada definición de miembro es una definición de variable normal, como int i; o flotar f; o cualquier otra definición de variable válida. Al final de la definición de la unión, antes del punto y coma final, puede especificar una o más variables de unión, pero es opcional. Esta es la forma en que definiría un tipo de unión llamado Data que tiene tres miembros i, f y str -

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

Ahora, una variable de Datatype puede almacenar un entero, un número de punto flotante o una cadena de caracteres. Significa que una sola variable, es decir, la misma ubicación de memoria, se puede usar para almacenar múltiples tipos de datos. Puede utilizar cualquier tipo de datos integrado o definido por el usuario dentro de una unión según sus requisitos.

La memoria ocupada por un sindicato será lo suficientemente grande como para albergar al miembro más grande del sindicato. Por ejemplo, en el ejemplo anterior, el tipo de datos ocupará 20 bytes de espacio de memoria porque este es el espacio máximo que puede ocupar una cadena de caracteres. El siguiente ejemplo muestra el tamaño de memoria total ocupado por la unión anterior:

#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;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Memory size occupied by data : 20

Acceso a miembros de la unión

Para acceder a cualquier miembro de un sindicato, utilizamos el member access operator (.). El operador de acceso a miembros está codificado como un punto entre el nombre de la variable de unión y el miembro de unión al que deseamos acceder. Usarías la palabra claveunionpara definir variables de tipo unión. El siguiente ejemplo muestra cómo utilizar uniones en un programa:

#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;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

Aquí, podemos ver que los valores de i y f miembros del sindicato se corrompieron porque el valor final asignado a la variable ha ocupado la ubicación de la memoria y esta es la razón por la que el valor de str El miembro se imprime muy bien.

Ahora veamos el mismo ejemplo una vez más, donde usaremos una variable a la vez, que es el propósito principal de tener uniones:

#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;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

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

Aquí, todos los miembros se imprimen muy bien porque se utiliza un miembro a la vez.