logo

Unión en C

Unión se puede definir como un tipo de datos definido por el usuario que es una colección de diferentes variables de diferentes tipos de datos en la misma ubicación de memoria. La unión también se puede definir como muchos miembros, pero solo un miembro puede contener un valor en un momento determinado.

Unión es un tipo de datos definido por el usuario, pero a diferencia de las estructuras, comparten la misma ubicación de memoria.

Entendamos esto a través de un ejemplo.

 struct abc { int a; char b; } 

El código anterior es la estructura definida por el usuario que consta de dos miembros, es decir, 'a' de tipo En t y 'b' de tipo personaje . Cuando verificamos las direcciones de 'a' y 'b', encontramos que sus direcciones son diferentes. Por lo tanto, concluimos que los miembros de la estructura no comparten la misma ubicación de memoria.

Cuando definimos la unión, encontramos que la unión se define de la misma manera que se define la estructura, pero la diferencia es que la palabra clave union se usa para definir el tipo de datos de la unión, mientras que la palabra clave struct se usa para definir la estructura. La unión contiene los miembros de datos, es decir, 'a' y 'b', cuando verificamos las direcciones de ambas variables encontramos que ambas tienen las mismas direcciones. Significa que los miembros del sindicato comparten la misma ubicación de memoria.

clasificación de inserción java

Echemos un vistazo a la representación gráfica de la asignación de memoria.

La siguiente figura muestra la representación pictórica de la estructura. La estructura tiene dos miembros; es decir, uno es de tipo entero y el otro es de tipo carácter. Dado que 1 bloque es igual a 1 byte; por lo tanto, a la variable 'a' se le asignarán 4 bloques de memoria, mientras que a la variable 'b' se le asignará 1 bloque de memoria.

La siguiente figura muestra la representación pictórica de los miembros del sindicato. Ambas variables comparten la misma ubicación de memoria y tienen la misma dirección inicial.

archivo json

En unión, los miembros compartirán la ubicación de la memoria. Si intentamos realizar cambios en cualquiera de los miembros, se reflejará también en el otro miembro. Entendamos este concepto a través de un ejemplo.

 union abc { int a; char b; }var; int main() { var.a = 66; printf('
 a = %d', var.a); printf('
 b = %d', var.b); } 

En el código anterior, la unión tiene dos miembros, es decir, 'a' y 'b'. La 'var' es una variable de tipo unión abc. En el principal() método, asignamos el 66 a la variable 'a', por lo que var.a imprimirá 66 en la pantalla. Dado que tanto 'a' como 'b' comparten la ubicación de memoria, var.b imprimirá ' B ' (código ascii de 66).

Decidir el tamaño de la unión

El tamaño del sindicato se basa en el tamaño del miembro más grande del sindicato.

Entendamos a través de un ejemplo.

 union abc{ int a; char b; float c; double d; }; int main() { printf('Size of union abc is %d', sizeof(union abc)); return 0; } 

Como sabemos, el tamaño de int es de 4 bytes, el tamaño de char es de 1 byte, el tamaño de float es de 4 bytes y el tamaño de double es de 8 bytes. Dado que la variable doble ocupa la mayor memoria entre las cuatro variables, se asignarán un total de 8 bytes en la memoria. Por lo tanto, la salida del programa anterior sería de 8 bytes.

Acceder a miembros del sindicato mediante punteros

Podemos acceder a los miembros del sindicato a través de punteros usando el operador de flecha (->).

Entendamos a través de un ejemplo.

aes vs des
 #include union abc { int a; char b; }; int main() { union abc *ptr; // pointer variable declaration union abc var; var.a= 90; ptr = &var; printf('The value of a is : %d', ptr->a); return 0; } 

En el código anterior, hemos creado una variable de puntero, es decir, *ptr, que almacena la dirección de la variable var. Ahora, ptr puede acceder a la variable 'a' usando el operador (->). Por lo tanto, el resultado del código anterior sería 90.

¿Por qué necesitamos sindicatos C?

Considere un ejemplo para comprender la necesidad de uniones C. Consideremos una tienda que tiene dos artículos:

  • Libros
  • Camisas

Los propietarios de tiendas quieren almacenar los registros de los dos elementos mencionados anteriormente junto con la información relevante. Por ejemplo, los libros incluyen título, autor, número de páginas, precio y las camisas incluyen color, diseño, talla y precio. La propiedad 'precio' es común en ambos artículos. El propietario de la tienda quiere almacenar las propiedades y luego cómo almacenará los registros.

Inicialmente, decidieron almacenar los registros en una estructura como se muestra a continuación:

 struct store { double price; char *title; char *author; int number_pages; int color; int size; char *design; }; 

La estructura anterior consta de todos los artículos que el propietario de la tienda desea almacenar. La estructura anterior es totalmente utilizable pero el precio es propiedad común tanto en los artículos como en el resto de artículos son individuales. Las propiedades como precio, *título, *autor y número_páginas pertenecen a Libros, mientras que el color, el tamaño y el *diseño pertenecen a Camisa.

Veamos cómo podemos acceder a los miembros de la estructura. .

 int main() { struct store book; book.title = 'C programming'; book.author = 'Paulo Cohelo'; book.number_pages = 190; book.price = 205; printf('Size is : %ld bytes', sizeof(book)); return 0; } 

En el código anterior, hemos creado una variable de tipo almacenar . Hemos asignado los valores a las variables título, autor, número_páginas, precio pero la variable libro no posee las propiedades como tamaño, color y diseño. Por tanto, es un desperdicio de memoria. El tamaño de la estructura anterior sería de 44 bytes.

Podemos ahorrar mucho espacio si utilizamos uniones.

 #include struct store { double price; union { struct{ char *title; char *author; int number_pages; } book; struct { int color; int size; char *design; } shirt; }item; }; int main() { struct store s; s.item.book.title = 'C programming'; s.item.book.author = 'John'; s.item.book.number_pages = 189; printf('Size is %ld', sizeof(s)); return 0; } 

En el código anterior, hemos creado una variable de tipo tienda. Dado que usamos las uniones en el código anterior, la mayor memoria ocupada por la variable se consideraría para la asignación de memoria. La salida del programa anterior es de 32 bytes. En el caso de las estructuras obtuvimos 44 bytes, mientras que en el caso de las uniones el tamaño obtenido es de 44 bytes. Por lo tanto, 44 ​​bytes es mayor que 32 bytes, lo que ahorra mucho espacio en la memoria.

lista de matrices ordenada java