枚举
枚举就是一一列举
比如:一周有7天、性别有男女、一个月有30天,都可以一一列举
枚举类型的定义
123456789101112 | enum Sex//枚举类型{ Male, Female, Secret//枚举的可能取值 - 常量};int main() { enum Sex s = Male;//这里只能赋Male、Female、Secret规定的三个值 printf("%d,%d,%d",Male,Female,Secret);//打印的结果是0,1,2 return 0;} |
枚举的优点
枚举相比#define的优点有哪些?
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较,枚举有类型检查,更严谨。(define只是替换)
- 防止命名污染
- 便于调试
- 使用方便,一次可以定义多个变量
联合(共用体)
联合也是一种特殊的自定义类型,这种类型定义的变量也包含了一系列的成员,特征是这些成员共用一块空间(所以联合也叫共用体)
联合类型的定义
12345678910111213141516 | union Un{ char c; int i;}; int main(){ union Un u; printf("%d\n",sizeof(u));//4 printf("%p\n",&u);//0x16fdff1c8 printf("%p\n",&(u.c));//0x16fdff1c8 printf("%p\n",&(u.i));//0x16fdff1c8 return 0;} |
上面可以知道,u这个联合变量,占4字节,并且u里面的int和char类型的地址是一样的。
联合的特点
联合的成员共用一块内存空间,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有保存那个成员的能力)
判断当前计算机的大小端存储:
参考:大小端介绍
123456789101112131415161718192021222324252627 | int check_sys(){ union Un { char c; int i; }u; u.i = 1; //返回1,小端 //返回0,大端 return u.c;}int main(){ int a = 1; int ret = check_sys(); if (1 == ret) { printf("小端\n"); } else { printf("大端\n"); } return 0;} |
联合大小的计算
- 联合大小最小是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,对齐到最大对齐数的整数倍。u的大小是8,是由于字符型的数组arr占5个字节,浪费3字节,对齐到8字节,是最大的成员,占8字节。
12345678910111213
union Un{ int a; char arr[5];}; int main(){ union Un u; printf("%d\n",sizeof(u));//8 return 0;}