枚举
枚举顾名思义就是一一列举。
把可能的取值一一列举。
- 声明枚举类型
enum Color
{
RED ,//默认为0
GREEN ,//1
BLUE,//2
};
int main()
{
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
- 输出0、1 、2
声明枚举类型
enum Color
{
RED = 5 ,//5
GREEN = 8,//8
BLUE//9
};
int main()
{
enum Color c = BLUE;
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
- 输出5 、 8、 9
- CPP 语法检查更加严格,cpp下不能写为enum Color c = 2;
枚举的优点
- 我们可以使用 #define 定义常量,为什么非要使用枚举? 枚举的优点:
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
枚举增加代码的可读性
void menu()
{
printf("*****************************\n");
printf("**** 1. add 2. sub *****\n");
printf("**** 3. mul 4. div *****\n");
printf("**** 0. exit *****\n");
printf("*****************************\n");
}
enum Option
{
EXIT,//0
ADD,//1
SUB,//2
MUL,//3
DIV//4
};
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
break;
case SUB:
break;
case MUL:
break;
case DIV:
break;
case EXIT:
break;
default:
break;
}
} while (input);
return 0;
}
联合体
成员公用一个空间的时候用- -联合体
#include<stdio.h>
union Un
{
char c;//1
int i;//4
};
int main()
{
union Un u = {10};
u.i = 1000;
u.c = 100;
printf("%p\n", &u);
printf("%p\n", &(u.c));
printf("%p\n", &(u.i));
//printf("%d\n", sizeof(u));//输出联合体的大小--4
return 0;
}
- 三个地址一模一样,看四个字节分配的情况就可以知道地址一样
- 联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员(这里为i)的大小
判断机器的大小端
- 用0x00 00 00 01这个数字来判断大小端只要拿到第一个字节看它为0还是1就可以知道了。
#include<stdio.h>
//法1
//int check_sys()
//{
// int a = 1;
// if ((*(char*)&a) == 1)
// {
// return 1;//小端
// }
// else
// {
// return 0;//大端
// }
//}
//法2
int check_sys()
{
union U
{
char c;
int i;
}u;
u.i = 1;
return u.c;
//返回1 就是小端
//返回0 就是大端
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
- 法1: *(char * )&a- -char * 是为了只取出第一个字节,即找到起始地址并且强制转换为char * 再解引用就可以只找到第一个字节的大小
- 法2:如下图,给 i 赋值为1(即0x 00 00 00 01),此时c就是第一个字节,return u.c即可以看返回值是1还是0即可以判断大小端
联合大小的计算
- 联合体大小- -最大的成员或者最大成员对齐到最大对齐数的整数倍
union Un
{
char a[5];//1
int i;//4
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));
return 0;
}
- 最大对齐数为4,a的数组里有5个元素,要对齐到4的整数倍即8- -联合体的大小
union Un
{
char a[5];//1
char c;//1
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));
return 0;
}
- 最大对齐数为1,a的数组里有5个元素,则要对齐到1的整数倍即5- -联合体的大小