C基础——联合union
## 联合
是一种数据类型,可以在同一块内存空间中存储不同类型的数据,但这些数据同时一刻只能有一种存在。
### (1)声明联合
声明形式与结构体类似。
```C
union hold
{
int digit;
double bigfl;
char letter;
};
```
以上声明的联合,一个联合变量可以存储一个int类型==或==一个double类型==或==一个char类型的数据
虽然同一类型的联合变量可以存储不同类型的数据,但他们在内存中的大小是相同的,即为声明中最大的类型所占据的字节数。例如,union hold类型的联合变量可以存储int类型或double类型或char类型的数据,但union hold类型的变量在内存中的大小都是8个字节,即为double类型所占的字节数。
### (2)3种初始化方法
第1种,将一个联合变量初始化为另一个同类型的联合变量。
```C
union hold n1;
n1.digit = 99.99;
union hold n2 = n1;
```
第2种,将联合初始化为声明中的第1个成员
```C
union hold n = {100};
```
第3种,使用指定初始化器,可以初始化为任意一个成员
```C
union hold n1 = {.letter = 'A'};
union hold n2 = {.bigfl = 199.99};
```
### (3)访问联合
与结构体一样,变量通过点运算符(.)访问联合成员,指针通过->访问。
```C
union hold n = {100}; //使用联合声明中的第1个成员初始化联合变量n
union hold *ptu = &n //声明一个union hold类型的指针,指向&n
n.bigfl = 31.4; //清除初始化的值,并将double类型数据赋值给联合变量n,通过点运算符访问bigfl成员
double d2 = ptu->bigfl; //指针通过指针访问联合成员,并为double类型变量b2赋值
```
使用联合的技巧之一是,用一个成员存储值,然后用另一个成员,以不同的类型来查看这个值。
另一种使用方法是,在结构体中存储与其成员有从属关系的信息,例如。
```C
struct owner
{
char oname[21];
...
};
struct leaser
{
char lname[21];
...
};
union info
{
struct owner ocar;
struct leaser lcar;
};
struct car_info
{
int id;
int status; // 私有为0,租赁为1
union inof holder_inof; //通过status的值决定holder_info的值
};
struct car_info car;
```
在结构变量c中,如果status的值为0,则程序将使用==car.holder_info.ocar.oname==;如果status的值为1,则程序将使用==car.holder_info.lcar.lname==
在结构体中的联合成员可以是匿名联合,与匿名结构的使用方式类似。