枚举类型:
枚举类型的变量创建类似于结构体
在其中声明变量的时候,若不主动赋值
就会自动从0开始依次给后面的枚举变量赋值
枚举类型的定义:
enum day
{
mon = 1, //注意是用逗号隔开的:
tue,
wed,
thr,
fri,
sat,
sun
};
//枚举的变量声明时默认按照0到n的顺序赋值
int main()
{
printf("%d\n", mon);
printf("%d\n", tue);
printf("%d\n", wed);
printf("%d\n",thr);
printf("%d\n",fri);
printf("%d\n",sat);
printf("%d\n",sun);
}
那么枚举变量有啥用呢
主要是可以在switch语句中将case后面的操作数换成枚举变量名
这样这个选项的功能便一目了然,增加了代码的可读性
譬如说这个通讯录,选择switch语句作为主体
在编辑对应选项的功能时,如果使用枚举变量,可以直接用变量的标识符代替数字
相信你会更喜欢下面这种,一眼就能知道这个选项是用来实现哪种功能的
再者,一次定义多个变量时(就像上面这个通讯录的功能模块一样),使用枚举变量也更有条理一些,如若分别去声明每个变量,总有种散乱的感觉
——————————————————————————————————————————
这里是分割线
——————————————————————————————————————————
联合(共用体):
定义:和枚举类型类似,同样是一种自定义类型,其中的每个成员共用一个空间
union un
{
int a;
char c;
};
struct st
{
int a;
char c;
};
int main()
{
struct st s;
printf("%d\n", sizeof(s));
union un u;
printf("%d\n", sizeof(u));
return 0;
}
运行结果:
在内存中和结构体的比较:
因为共用体的存储是将多个变量塞到同一块空间去,被塞进去的那个空间就必须是共用体成员中最大的那个(如上图的a变量)
同时一个共用体的大小至少也是最大成员的大小,因此联合un的大小为4
至于结构体st的大小为8,是因为结构体在内存中的存储存在“对齐”的情况:
按照这个规则,由于结构体st的成员最大对齐数为4
其本身大小也必须为4的倍数,又因为成员变量c的存在,所以最终st的大小为8
在内存中的排布见上图
另外一个例子:
在内存中:
——————————————————————————————————————————
这里是分割线
——————————————————————————————————————————
通过共用体判断机器大小端:
int check_sys()
{
union un
{
char c; //返回1为小端,返回0为大端
int i;
}u;
u.i = 1;
return u.c;
}
int main()
{
int a = 1;
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else if (ret == 0)
printf("大端\n");
return 0;
}
这个代码的原理:
创建一个联合体,成员最大为4字节的int
再创建一个int类型的数据
如果是小端(从小到大存储)
i在内存中就是01 00 00 00
如果是大端
就是00 00 00 01
所以返回时如果是1就是小端
返回0就是大端
联合体大小的计算:
联合的大小至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍时就会对齐到最大对齐数的整数倍
(最大对齐数就是大小最大成员的大小与默认对齐数取小)
union un
{
char arr[5];
int i;
};
int main()
{
printf("%d\n", sizeof(union un));
//结构体存在对齐,联合体也存在对齐
return 0;
}
联合体un大小为:
因为最大对齐数为4(int i),该联合体的大小为4 的倍数取8
——————————————————————————————————————————
这里是底线
——————————————————————————————————————————