1. 联合体类型的声明
2. 联合体的特点
3. 联合体大小的计算
4. 枚举类型的声明
5. 枚举类型的优点
6. 枚举类型的使用
欢迎关注 熬夜学编程
创作不易,请多多支持
感谢大家的阅读、点赞、收藏和关注
如有问题,欢迎指正
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;//使用枚举常量为枚举变量赋值