2.枚举
顾名思义就是列举,将有可能的值一一列举出来
例如
月份有12个月可以一一列举 三原色也可以列举
2.1 枚举类型的定义
enum Day//星期 { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; enum Color//三原色 { Red, Green, Blue };
以上定义的 enum Day和 enum Color都是枚举类型
{}中的内容是枚举类型的可能取值,也称作枚举常量
这些可能的取值都是有初值的,默认第一个枚举常量的值是从0开始,依次递增,也可以在定义枚举类型是赋予初值。
2.2 枚举的优点
1. 增加代码的可读性和可维护性 2. 相比于 `#define`定义的全局变量,枚举有类型,更加严谨 3. 防止命名污染(将整个枚举常量封装起来) 4. 便于调试 5. 使用方便,一次可定义多个枚举常量
2.3 枚举的使用
枚举的使用其实就是利用枚举常量本身就有一定的数值,然后给其他变量赋值。
例如
enum Sex { //赋以初值 nan=1, nv=2, secret=3 }; int main() { enum Sex ma = nan; printf("%d\n", nan); return 0; }
3.联合(又称共用)
3.1 联合类型的定义
联合也是一种特殊的自定义类型,包含一系列的成员,特殊的是这些成员共用一块空间(也称作共用)
//联合类型的声明 union M { char c; int i; }; int main() { //联合变量的定义 union M m; //计算联合变量的大小 printf("%d\n", sizeof(m)); return 0; }
这里计算出的联合变量的大小就充分说明共用的思想,具体怎么共用的,接下来慢慢解析。
3.2 联合的特点
联合的成员是共用同一块内存空间,联合变量的大小至少是最大成员的大小 联合至少要能确保保存其中最大的成员。
union M { char c; int i; }; int main() { union M m; printf("%p\n", &(m.c)); printf("%p\n", &(m.i)); return 0; }
这里可以发现两个成员的地址是相同的,更一步体现了共用的思想
3.3 联合大小的计算
1. 联合的大小至少是最大成员的大小 2. 当最大成员大小不是最大对齐数的整数倍时,联合的总大小就要 对齐到最大对齐数的整数倍(4byte或者1byte)。
union M { char c[5]; int i; }; int main() { union M m; printf("%d\n",sizeof(m)); return 0; }
首先 char c[5],占5个字节, int i占4个字节,当然是共用的,此时联合总大小已是5个字节,由于最大成员 char c[5]的大小不是最大对齐数(4)的整数倍,联合的大小就要求对齐到最大对齐数的整数倍,最后联合的大小就是8个字节,下图便于理解
可以利用联合共用内存空间这个特点,写个程序去判断大小端
int check() { union M { char c; int i; }m; m.i = 1; return m.c; } int main() { int ret = check(); if (ret == 1) { printf("小端\n"); } else printf("大端\n"); return 0; }
相比于通过指针去访问然后返回,这个方法是非常的巧妙。
(这里的大小端在内存的存储中有详细的讲解
link感兴趣的可以去看看)