1. 联合体
1.1 联合体类型的声明
像结构体一样,联合体也是由一个或多个成员构成,这些成员可以是不同类型。
但是编译器只为最大的成员分配足够的内存空间。联合体特点是所有成员共用同一块内存空间。所以联合体也叫共同体。
给成员其中一个赋值,其他成员的值也跟着变化。
#include<stdio.h> //联合类型的声明 union UN { char ch; int i; }; int main() { //联合变量定义 union UN un = { 0 }; un.i = 1; printf("%zd", sizeof(un)); return 0; }

1.2联合体的特点
联合的成员是共用同一块内存空间,联合体的大小至少是最大成员的大小。



1.3 相同成员的结构体和联合体对比

1.4 联合体大小的计算
-> 联合体的大小至少是最大成员的大小。
->当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。
union Un
{
char a[5];
int i;
};
union Un1
{
short a[7];
int i;
};
int main()
{
union Un un = { 0 };
union Un1 un1 = { 0 };
printf("%zd\n", sizeof(un));
printf("%zd\n", sizeof(un1));
return 0;
}结果:

1.5 联合一个练习
使用联合体写程序,判断当前机器属于大端还是小端?(百度试题)
int main()
{
union Un
{
char c;
int i;
};
union Un un = { 0 };
un.i = 1;
if (un.c == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}举一反三: 不使用联合体判断机器属于大小端字节序列?
int main()
{
int a = 1;
if (*((char*)&a)== 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}4.枚举类型的声明
关键字:enum。
//枚举日期 enum Day { Mon, Tues, Wed, Thur, Fri, Sat, Sun, };
//枚举性别 enum Sex { MALE, FEMALE, SECRET, };
//枚举三原色 enum Color { RED, GREEN, BLUE, };
这些枚举的值默认从0开始,依次递增1,也可以对枚举类型赋初值。
如:
//枚举三原色 enum Color { RED=3, GREEN=7, BLUE=8, };
5. 枚举类型的优点
我们也可以使用#define定义常量,为什么还有枚举?
枚举的优点: 1. 增加代码的可读性和可维护性。 2. 和#define定义的标识符比较枚举有类型检查,更加严谨。 3. 便于调试,预处理阶段会删除 #define 定义的符号。 4. 使用方便,一次可以定义多个变量。 5. 枚举变量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。
6 枚举类型的使用
enum Color { RED=3, GREEN=7, BLUE=8, }; enum Color cls = GREEN;//使用枚举常量为枚举变量赋值