Unions are derived data types, the way structures are. Unions and structures look alike, but are engaged in totally different activities
Both structures and unions are used to group a number of different variables together. But while a structure enables us treat a number of different variables stored at different places in memory, a union enables us to treat the same space in memory as a number of different variables. That is, a union offers a way for a section of memory to be treated as a variable of one type on one occasion, and as a different variable of a different type on another occasion
Example of Union In C
# include <stdio.h>
int main( )
{
union a
{
short int i ;
char ch[ 2 ] ;
} ;
union a key ;
key.i = 512 ;
printf ( "key.i = %d\n", key.i ) ;
printf ( "key.ch[ 0 ] = %d\n", key.ch[ 0 ] ) ;
printf ( "key.ch[ 1 ] = %d\n", key.ch[ 1 ] ) ;
return 0 ;
}
Output of this programme
key.i = 512
key.ch[ 0 ] = 0
key.ch[ 1 ] = 2
As you can see, first we declared a data type of the type union a, and then a variable key to be of the type union a. This is similar to the way we first declare the structure type and then the structure variables. Also, the union elements are accessed exactly the same way in which the structure elements are accessed, using a ‘.’ operator. However, the similarity ends here
To illustrate this let us compare the following data types:
struct a
{
short int i ;
char ch[ 2 ] ;
} ;
struct a key
This data type would occupy 4 bytes in memory, 2 for key.i and 1 each for key.ch[ 0 ] and key.ch[ 1 ]

Now we declare a similar data type, but instead of using a structure we use a union
union a
{
short int i ;
char ch[ 2 ] ;
} ;
union a key ;

the union occupies only 2 bytes in memory. Note that the same memory locations that are used for key.i are also being used by key.ch[ 0 ] and key.ch[ 1 ]. It means that the memory locations used by key.i can also be accessed using key.ch[ 0 ] and key.ch[ 1 ]. What purpose does this serve? Well, now we can access the 2 bytes simultaneously (by using key.i) or the same 2 bytes individually (using key.ch[ 0 ] and key.ch[ 1 ]).
Example of Union in C
# include <stdio.h>
int main( )
{
union a
{
short int i ;
char ch[ 2 ] ;
} ;
union a key ;
key.i = 512 ;
printf ( "key.i = %d\n", key.i ) ;
printf ( "key.ch[ 0 ] = %d\n", key.ch[ 0 ] ) ;
printf ( "key.ch[ 1 ] = %d\n", key.ch[ 1 ] ) ;
key.ch[ 0 ] = 50 ; /* assign a new value to key.ch[ 0 ] */
printf ( "key.i = %d\n", key.i ) ;
printf ( "key.ch[ 0 ] = %d\n", key.ch[ 0 ] ) ;
printf ( "key.ch[ 1 ] = %d\n", key.ch[ 1 ] ) ;
return 0 ;
}
Output of this programme
key.i = 512
key.ch[ 0 ] = 0
key.ch[ 1 ] = 2
key.i= 562
key.ch[ 0 ] = 50
key.ch[ 1 ] = 2