枚举类型
解决问题:宏名过多,导致代码松散
因此,引入了 枚举类型,能够列出所有可能的取值,并取一个名字。
定义:枚举是一种类型
enum 枚举类型名{值1, 值2, 值3 ....};
注意:enum
是一个新的关键字,用来定义枚举类型
举例:小学生学校开的科目:Chinese、Math、English、Science
enum subject{Chinese, Math, English, Science};
// 等价于
enum subject{Chinese=0, Math=1, English=2, Science=3};
// 用预处理命令来定义就是
#define Chinese 0
#define Math 1
#define English 2
#define Science 3
这里也可以给每个科目定义一个值
enum subject{Chinese=1, Math, English, Science};
// 等价于
enum subject{Chinese=1, Math=2, English=3, Science=4};
定义枚举变量
// 直接定义变量
enum subject p1, p2; // p1, p2 都是一个枚举类型的变量
// 也可以在定义枚举类型的时候,定义变量
enum subject{Chinese=1, Math, English, Science} p1, p2;
#include "stdio.h"
int main(){
enum subject{Chinese=1, Math, English, Science} a;
scanf("%d", &a);
scanf("%*[^\n]"); scanf("%*c"); // 清空缓存区
switch (a){
case Chinese: printf("这是语文课"); break;
case Math: printf("这是数学课"); break;
case English: printf("这是英语课"); break;
case Science: printf("这是科学课"); break;
default: printf("输入错误"); break;
}
return 0;
}
注意:
- 枚举和宏类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。
- 枚举类型变量需要存放的是一个整数,占用的内存和
int
占用的一样
共用体:一般在单片机中使用
和结构体类似的一个数据类型:共用体
定义:
union 共用体名{
变量1;
变量2;
};
结构体和共用体的区别:
- 结构体的各个成员会占用不同的内存,互相之间没有影响;结构体占用的内存大于等于所有成员占用内存的总和
- 共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员;共用体占用的内存等于最大成员占用的内存
共用体的定义类型和定义变量,和结构体一致。
大端和小端:指数据在内存中的存储模式,由CPU决定
- 大端模式:将数据的低位放在内存的高地址上,数据的高位放在内存的低地址上。
- 小端模式:将数据的低位放在内存的低地址上,数据的高位放在内存的高地址上。
// 举例: 8位二进制数,占用一个字节内存
0x0034 // 34就是数据的低位,00就是数据的高位
可以借助共用体来检测 CPU
是 大端模式 还是小端模式
#include "stdio.h"
union data{
int num;
char s;
};
int main(){
// 共用体的所有成员共用一块内存,这里 num占用4个字节,s占用一个字节
// 给num 赋值, 相当于 num = 0x00000001
// 1 是数据低位,如果内存低位也是1,则CPU是小端模式,否则是大端模式
// s所占用的内存,要么是num的高位内存地址,要么是低位内存地址,
// 如果 s == 1, 则表示 s所占用的内存是低位内存地址,内存低位也是1,则CPU是小端模式
union data p1 = {1};
if (p1.s == 1){
printf("小端模式");
}
else{
printf("大端模式");
}
return 0;
}