枚举
枚举是C语言中的基本数据类型,就是能把可能的取值一 一举例 比如:性别、星期、月份 这些情况下就可以使用枚举类型
枚举类型的定义
枚举类型的语法形式:
enum 枚举名称
{
枚举元素1;
枚举元素2;
......
};
枚举类型的定义:
enum Day
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
- 以上定义的 enum Day 是枚举类型。
{ }中的内容是枚举类型的可能取值,也叫枚举常量。 这些可能取值最开始都是默认从0开始,一次递增1
当然在定义的时候也可以赋初值 例如:
enum Sex
{
MALE = 5,
FEMALE,
SECRET
};
enum Sex
{
MALE = 5,
FEMALE = 8,
SECRET= 9
};
枚举的优点
- 代码的简洁性、增加代码的可读性和可维护性
枚举 enum 和 define 对标 如果不使用枚举,用 #define定义来为每个可能定义一个别名
#define MALE
#define FEMALE
#define SECRET
以枚举的方式定义:
enum sex
{
MALE;
FEMALE;
SECRET
};
- 定义性别时看起来还没什么,如果可能性比较多,比如:月份
那代码就比较多且臃肿,如果使用枚举就会很简洁,而且增加代码的可读性和可维护性
还有就是以枚举类型定义具有一定的意义 可以使用到一些程序中
enum sex
{
MALE;
FEMALE;
SECRET
};
int main()
{
enum sex a;
a = MALE;
printf("%d",a);
return 0;
}
- 和#define定义的标识符比较枚举有类型检查,更加严谨
- 防止命名污染
- 便于调试
- 使用方便,一次可以定义多个常量
枚举的使用
enum Day
{
Mon=1,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
int main()
{
printf("%d\n", Mon);
printf("%d\n", Tues);
printf("%d\n", Wed);
printf("%d\n", Thur);
printf("%d\n", Fri);
printf("%d\n", Sat);
printf("%d\n", Sun);
return 0;
}
遍历枚举类型
在C语言中枚举类型是被当做 int 或者 unsigned int 类型来处理的 所以按照 C 语言规范是没有办法遍历枚举类型的。 不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。
例如:
#include <stdio.h>
enum DAY{
MON=1,
TUE,
WED,
THU,
FRI,
SAT,
SUN
} day;
int main()
{
for (day = MON; day <= SUN; day++)
{
printf("枚举元素:%d \n", day);
}
}
return 0;
关于枚举还有很多使用常景,需要慢慢体会
联合体(共用体)union
联合体也叫共用体,是一种特殊的自定义类型 union 是联合体的关键字 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体) 联合体语法形式: 书写的格式和结构类似
union ud
{
int a;
char b;
};
联合体的体点
联合体的特点:联合体成员都是使用同一块空间,每次使用空间只能选一个成员使用,不能同时使用 比如:a成员使用空间,那 b 成员就不能使用,反之b成员使用空间,那 a 成员就不能使用 例如: 下面测试联合体的大小问题
union ud
{
int a;
char b;
};
int main()
{
union ud u;
printf("%d\n",sizeof(u));
}
测试结果:
- 结果为什么是 4 呢?
联合的成员是共用同一块内存空间的,这样一个联合变量的大小 至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)
那么联合体的成员 a 和成员 b 的地址是否是一样的呢?
- 从图片上可以看出大家的地址都是一样的
- 因为二者公用一个内存的话,二者指针指向的位置必须是一样的这样才能找到相应的空间。
判断当前计算机的大小端存储
这是之前写过的判断大小端存储的问题,先在我们用联合体来判断
int check_sys()
{
int i = 1;
return *(char*)&i;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
}
用联合体来判断大小端存储
int check_sys()
{
union s
{
int i;
char c;
}u;
u.i = 1;
return u.c;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
}
- 用联合体创建二个成语,分别是
int i 和 char c , int i 赋值为 1 小端存储:01 00 00 00 大端存储:00 00 00 01 直接返回 u .c ,因为成员u.c 是char 类型,读取的是一个字节 返回 0 是大端,返回 1 是小端
联合大小的计算
联合体也是存在对齐的
- 联合的大小至少是最大成员的大小
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
例如:
union Un1
{
char c[5];
int i;
};
int main()
{
printf("%d\n", sizeof(union Un1));
}
char c[ 5 ] 有5个元素是占5个空间,char 类型是 1 个字节int i 是整型,占 4 个字节- 它们的最大的对齐数是 4 ,而
char c[5] 所占的空间是5个, 5并不是4 的倍数 那就在浪费掉 3 个空间找到 4 的整数倍,也就是 8
例题 2:
union Un2
{
short c[7];
int i;
};
int main()
{
printf("%d\n", sizeof(union Un2));
}
- short 是短整形占 2 个字节,有 7 个元素,2*7 = 14 个字节
int i 是整型,占 4 个字节- 它们的最大的对齐数是 4 ,而
short c[7] 所占的空间是14个字节,14 并不是4 的倍数 那就在浪费掉 2 个空间找到 4 的整数倍,也就是 16
|