枚举
什么是枚举?
枚举就是将一些可能的取值一一列举出来。
例如我们现实生活中的:
星期一至星期天、性别,月份,颜色等都可以一一的列举出来。此时就可以使用枚举了
枚举类型的定义
枚举的关键字为enum
,枚举的英文为enumeration.
//枚举举例
enum Color
{
red,
yellow,
blue,
green //最后一个不要要逗号
}; //别忘记分号
//sex
enum Sex
{
male,
female,
secret
};
//星期
enum Day
{
Monday,
Tuesday,
Wedsday,
Thurday,
Friday,
Satday,
Sunday
};
上面例子中的enum Color, enum Day, enum Sex都是枚举类型。花括号{}中的内容就是所在枚举内所有可能取值,叫做枚举常量。
它叫做枚举常量,但是常量我们是可以知道它的值的,枚举常量的值是多少呢?我们将使用其中一个例子来看看
显示出来的结果是0、1、2、3.
其实对于枚举常量来说,在我们没有给它赋值的情况下,第一个值默认为0,剩下的值依次递增1。如果赋值给其中一个量那么就会按照赋值的那个数开始,往后的值依次递增1.虽然枚举常量是常量,但是我们可以在声明的时候对它进行赋值。
我们使用刚才的例子将第一个常量赋值为2:
又如我们将其中一个量赋值为7:
枚举的优点
我们在平常可以使用宏来定义常量,但是为什么会有使用枚举的情况呢?
枚举有几大优点:
- 增加了代码的可读性和可维护性
- 枚举有类型的检查,比较严谨
- 防止了命名污染
- 比较方便,一次可以定义很多个常量
联合
联合又称为共用体。它是一种比较特殊的自定义类型,它的所有成员公用同一块空间,所以它叫做(联合)共用体。
联合是什么样子的呢?联合的关键字:union
//联合的声明
union Un
{
int a;
char b;
}; //分号不要忘记
联合的成员是共同用一块内存空间的。那么联合所占的内存空间最起码要容纳得下最大得那个成员。这也是联合最重要的一个特点。
在之前的文章中,我有谈论过大小端存储模式。
来回顾一下什么是大小端存储模式?
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
使用联合也可以计算出所使用的计算机采用的是哪一种存储模式
//大端存储还是小端存储
# include <stdio.h>
union Un
{
int a;
char b;
};
//创建变量
union Un i ;
int main(void)
{
i.a = 1;
if (i.b == 1)
{
printf("是小端存储\n");
}
else
{
printf("是大端存储\n");
}
return 0;
}
联合空间大小的计算
在计算结构体的大小时,涉及到了结构体的内存对齐。那么联合的大小是否存在内存对齐呢?
首先需要了解两个点
- 联合的大小最起码能存放得下最大的那个成员。
- 联合的最大成员大小不是对齐数的整数倍的时候需要对齐到最大对齐数的整数倍。
//例一
union Un1
{
char c[5];
int i;
};
//例二
union Un2
{
short c[7];
int i;
};
你能猜出例一和例二中联合的大小吗?
以上就是本文要讲解的内容。