一.联合体类型的声明
和结构体一样,由一个或多个成员组成,可以由不同类型组成
关键字:union
形式:

特点:编译器只为最大的成员的分配足够的空间,使所有成员可共用同一片空间,所以联合体也叫做共用体
举例:
代码1:
#include <stdio.h>
union Un
{int a;char c;
};
int main()
{union Un un = { 0 };un.a = 0x11223344;un.c = 0x55;printf("%x", un.a);return 0;
}

代码2:
#include <stdio.h>
union Un
{int a;char c;
};
int main()
{union Un un = { 0 };printf("%p\n", &un);printf("%p\n", &(un.a));printf("%p\n", &(un.c));return 0;
}

图像:

结构体的枚举的对比:

二.计算联合体的大小
规则:
1.联合体的大小为至少为最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍
举例:
代码:
#include <stdio.h>
union Un
{int a;char c[5];};
int main()
{printf("%zu", sizeof(union Un));return 0;
}
结果和解释:

练习:
大小端字节序的判断(利用联合体公共一片空间的特点)
代码:
#include <stdio.h>
union Un
{int a;char c;
};
void check_sys()
{union Un un = { 0 };un.a = 1;if (un.c == 1)printf("小端");elseprintf("大端");
}
int main()
{check_sys();return 0;
}
匿名联合体形式:
#include <stdio.h> void check_sys()
{union{int a;char c;}un;un.a = 1;if (un.c == 1)printf("小端");elseprintf("大端");
}
int main()
{check_sys();return 0;
}
‘结果:

联合体可以节省空间例子如下:

写成结构体一般如下:
struct gift_list{//公共属性int stock_number;//库存量double price; //定价int item_type;//商品类型//特殊属性char title[20];//书名char author[20];//作者int num_pages;//⻚数char design[30];/设计int colors;//颜⾊int sizes;//尺⼨};
优化:

三.枚举
枚举类型的声明
将可能值一一例举
形式:

这些可能取值是有值的,默认是从零开始,依次递增1,也可以赋值

优点:

