十、联合体
10.1 联合体介绍及声明格式
联合体是一种数据类型,能在同一片内存空间中存放不同的数据类型,但不是同时储存
例如在联合体内存放int,char,double类型的数据,编译器会开辟一个空间以便存放联合体里
最大字节的类型,那么在本例中占用最大字节的类型是double,所以会开辟一个64位的空间
联合体声明格式:
union type
{
char letter;
int digit;
double bigfl;
};
联合体开辟的64位空间每次只能储存一个值,第二次储存的值会覆盖第一次储存的值,根据
下面的初始化可以更好理解
10.2 联合体初始化
10.2.1 用已有的同类型联合体初始化
union type t;
t.letter = 'A';
union type s = t;
10.2.2 声明时初始化
union type b = {'C'};
由于type类型联合体里第一个成员的类型是char,所以这种方式会将'C'初始化给letter。
前面提到联合体只能储存一个值,所以这种初始化的方式花括号只能有一个元素,这个元素赋联合体里的第一个成员。
10.2.3 声明时指定初始化
union type b = { .bigfl = 2.2222 };
10.3 联合体使用
10.3.1 联合体赋值
b.letter = 'G';
b.digit = 33333;
b.bigfl = 4555.323;
这里的点运算符表示现在在使用哪种数据类型的成员。由于联合体每次只能存放一个值,即使有足够的空间也不会同时存放char和int类型的值。所以第二行代码在赋值时会先将空间中存放的'G'
清除,再存放33333,第三行同理
10.3.2联合体指针
union type t;
t.letter = 'A';
union type* pt=&t;
pt->letter;
10.4联合体大小计算规则
1.联合体大小至少是最大数据类型的大小
2.当最大数据类型的大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍
union hold
{
int z;
char a[5];
};
上面这个联合体占用空间最大的数据类型是char a[5],需要5位的空间。
int的对齐数是4,char的对齐数是1,所以联合体最大对齐数是4
5不是4的整数倍,所以需要浪费3个位,则联合体的大小为8
printf("%d", sizeof(h));
结果:8