English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico de lenguaje C

Control de flujo de lenguaje C

Funciones en C

Arreglos en C

Punteros en C

Cadenas en C

Estructura de lenguaje C

Archivo de lenguaje C

C otros

Manual de referencia de C

Uniones (Union) en C

En este tutorial, aprenderá sobre los tipos de datos comunes en el lenguaje de programación C. Más específicamente, cómo crear tipos de datos comunes, acceder a sus miembros y comprender la diferencia entre los tipos de datos comunes y las estructuras. Los tipos de datos comunes también se conocen como 'uniones' y se clasifican junto con las estructuras en el tipo de datos estructurado del lenguaje de programación C.

Un tipo de datos comunes es un tipo de datos especial que permite almacenar diferentes tipos de datos en la misma posición de memoria. Puede definir un tipo de datos comunes con múltiples miembros, pero en cualquier momento solo puede haber un miembro con un valor. Los tipos de datos comunes proporcionan una manera efectiva de usar la misma posición de memoria.

El tipo de datos comunes también es un tipo de datos definido por el usuario, similar a 'union' en C.structcon la diferencia de una palabra clave. La estructura asigna suficiente espacio para almacenar todos sus miembros, mientras que el tipo de datos comunes asigna espacio solo para el miembro más grande.

¿Cómo se define un tipo de datos comunes?

Usamos la palabra clave 'union' para definir un tipo de datos comunes. Este es un ejemplo:

union car
{
  char name[50];
  int price;
};

El código anterior define el tipo derivado de unión car.

Crear una variable de unión

Después de definir la unión, se crea un tipo de usuario definido. Pero, no se asigna memoria. Para asignar memoria al tipo de unión dado y usarlo, necesitamos crear una variable.

Esta es la manera de crear una variable de unión.

union car
{
  char name[50];
  int price;
};
int main()
{
  union car car1, car2, *car3;
  return 0;
}

Otra manera de crear una variable de unión es:

union car
{
  char name[50];
  int price;
}1, car2, *car3;

En ambos casos, se crea una variable de tipo unión car1、car2y el puntero de unión car3。

Acceder a los miembros de la unión

Usamos el operador . para acceder a los miembros de la unión. Para acceder a las variables de puntero, también usamos-> operador。

En el ejemplo anterior,

  • Para acceder a car1el precio (price) del coche, utilice car1.price。

  • Para acceder a car3el precio (price) del coche, se puede usar (* car3).price o car3-> price。

La diferencia entre la unión y la estructura

Vamos a explicar con un ejemplo la diferencia entre la unión y la estructura:

#include <stdio.h>
union unionJob
{
   //Definir una unión
   char name[32];
   float salary;
   int workerNo;
} uJob;
struct structJob
{
   char name[32];
   float salary;
   int workerNo;
} sJob;
int main()
{
   printf("union 的大小 = %d bytes", sizeof(uJob));
   printf("\nstruct 的大小 = %d bytes", sizeof(sJob));
   return 0;
}

Resultado de la salida

el tamaño de union = 32 bytes
el tamaño de structure  = 40 bytes

¿Por qué hay una diferencia en el tamaño entre las variables de unión y las estructuras?

en este caso, el tamaño de sJob es40 bytes, porque

  • name[32]tamaño es32un byte

  • el tamaño de salary es4un byte

  • el tamaño de workerNo es4un byte

pero, el tamaño de uJob es32un byte. Esto se debe a que el tamaño de la variable de unión siempre será el tamaño del elemento más grande. En el ejemplo anterior, el elemento más grande es (name[32])tamaño es32un byte.

Al usar la unión, todos los miembros compartenla misma memoria

Ejemplo: acceso a los miembros de la unión

#include <stdio.h>
union Job {
   float salary;
   int workerNo;
} j;
int main() {
   j.salary = 12.3;
    //cuando j.workerNo se asigna
    // j.salary ya no se conservará12.3
   j.workerNo = 100;
   printf("Salario = %.1f\n", j.salary);
   printf("Número de trabajadores = %d", j.workerNo);
   return 0;
}

Resultado de la salida

Salario = 0.0
Número de trabajadores = 100