Unión en C

Al igual que Structures , union es un tipo de datos definido por el usuario. En unión, todos los miembros comparten la misma ubicación de memoria.

Por ejemplo, en el siguiente programa en C, tanto x como y comparten la misma ubicación. Si cambiamos x, podemos ver los cambios reflejados en y.

#include <stdio.h>
  
// Declaration of union is same as structures
union test {
    int x, y;
};
  
int main()
{
    // A union variable t
    union test t;
  
    t.x = 2; // t.y also gets value 2
    printf("After making x = 2:\n x = %d, y = %d\n\n",
           t.x, t.y);
  
    t.y = 10; // t.x is also updated to 10
    printf("After making y = 10:\n x = %d, y = %d\n\n",
           t.x, t.y);
    return 0;
}
Producción:

After making x = 2:
 x = 2, y = 2

After making y = 10:
 x = 10, y = 10

 
¿Cómo decide el compilador el tamaño de la unión?
El tamaño de una unión se toma de acuerdo con el tamaño del miembro más grande de la unión.

#include <stdio.h>
  
union test1 {
    int x;
    int y;
} Test1;
  
union test2 {
    int x;
    char y;
} Test2;
  
union test3 {
    int arr[10];
    char y;
} Test3;
  
int main()
{
    printf("sizeof(test1) = %lu, sizeof(test2) = %lu, "
           "sizeof(test3) = %lu",
           sizeof(Test1),
           sizeof(Test2), sizeof(Test3));
    return 0;
}
Producción:

sizeof(test1) = 4, sizeof(test2) = 4, sizeof(test3) = 40

 
¿Puntos para los sindicatos?
Al igual que las estructuras, podemos tener punteros a uniones y acceder a los miembros mediante el operador de flecha (->). El siguiente ejemplo demuestra lo mismo.

#include <stdio.h>
  
union test {
    int x;
    char y;
};
  
int main()
{
    union test p1;
    p1.x = 65;
  
    // p2 is a pointer to union p1
    union test* p2 = &p1;
  
    // Accessing union members using pointer
    printf("%d %c", p2->x, p2->y);
    return 0;
}
Producción:

65 A

 
¿Cuáles son las aplicaciones de unión?
Las uniones pueden ser útiles en muchas situaciones en las que queremos usar la misma memoria para dos o más miembros. Por ejemplo, supongamos que queremos implementar una estructura de datos de árbol binario donde cada Node hoja tiene un valor de datos doble, mientras que cada Node interno tiene punteros a dos hijos, pero no datos. Si declaramos esto como:

struct NODE {
    struct NODE* left;
    struct NODE* right;
    double data;
};

luego, cada Node requiere 16 bytes, con la mitad de los bytes desperdiciados para cada tipo de Node. Por otro lado, si declaramos un Node de la siguiente manera, podemos ahorrar espacio.

struct NODE {
    bool is_leaf;
    union {
        struct
        {
            struct NODE* left;
            struct NODE* right;
        } internal;
        double data;
    } info;
};

El ejemplo anterior está tomado del libro Computer Systems: A Programmer’s Perspective (English) 2nd Edition .

Referencias:
http://en.wikipedia.org/wiki/Union_type
Sistemas informáticos: la perspectiva de un programador (inglés) 2.ª edición

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *