a union is a derived type (similar to structure) with members that share the same storage space. sometimes the same type of construct needs different types of data. used when its necessary to store different types of data in the same storage area.
unions have members. only one member can contain a value at any time so only one access of a member at a given time. a member can have any data type.
unions are useful in embedded programming, situations where direct access to the hardware/memory is needed
Defining a union
the declaration is like structure
union [uniontag] {
type1 identifier1;
type2 identifier2;
...
} optional_vriable_definitions;
the union tag is optional and each member definition is a normal variable definition
example:
union data {
int i;
float f;
char str[20];
}data;
the length of this is same as 'str' variable cause it hase the largest size in the union.
Creating union variables
example:
#include <stdio.h>
union car {
int i;
float f;
char c[40];
};
int main(){
union car car1, car2, *car3; // note: car3 is a pointer
printf("memory size occupied by data union %zu\n", sizeof(car1));
return 0;
}
Anonymous unions
in c11 an unnamed memory union of structure.
example:
#include <stdio.h>
struct owner {
char socsecurity[12];
};
struct leasecompany {
char name[40];
char headquarters[40];
};
struct car_data {
char make[15];
int status;
union { // anonymous uniondefined in a struct with
// no name and cant be user anywhere else
struct owner owncr;
struct leasecompany leasecar;
};
};
Accessing union members
exactly like accessing struct members and values
union {
int code;
float cost;
} item;
item.code = 1245;
union {
int code;
float cost;
} item, *ptrst;
ptrst = &item;
ptrst->code = 432;
we have three ways:
ptrst->code
item.code
(*ptrst).code
example:
#include <stdio.h>
union mixed {
char c;
float f;
int i;
};
int main(){
union mixed x;
x.c = 'd';
printf("character: %c\n",x.c);
return 0;
}