目录
1.枚举
1.1何为枚举?
顾名思义就是一 一列举。
把可能的取值一 一列举。
比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一 一列举。
性别有:男、女、保密,也可以一 一列举。
月份有12个月,也可以一 一列举。
1.2枚举类型的定义
enum [标签名称]
{
成员声明列表
};
举例
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};
以上定义的
enum Day
,
enum Sex
,
enum Color
都是枚举类型。
{ }
中的内容是枚举类型的可能取值,也叫
枚举常量
。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
理解加深:
(1)枚举常量都是有值的
默认从0开始,依次递增1。
#include<stdio.h>
enum Color//颜色
{
RED,
GREEN,
BLUE
};
int main()
{
printf("%d \n", RED);
printf("%d \n", GREEN);
printf("%d \n", BLUE);
return 0;
}
也可以赋初值。若只有前面赋值,后面开始,依次递增1。
#include<stdio.h>
enum Day//星期
{
Mon,
Tues,
Wed=7,
Thur,
Fri=100,
Sat=0,
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;
}
(2) 只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
1.3枚举的优点
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
(1) 增加代码的可读性和可维护性比如:写项目的菜单。(2)和 #define 定义的标识符比较枚举有类型检查,更加严谨。比如:#define定义的标识符常量是没有类型的。而使用枚举定义,其定义的常量是枚举类型,也是一种类型。(3)便于调试比如:创建枚举变量后调试可以在监视窗口看到枚举常量的值。图1-1,1-2(4) 使用方便,一次可以定义多个常量
图1-1
图1-2
2.联合(共用体)
2.1联合类型的定义
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
形式如下:
union [标签名称]
{
成员声明列表
};
//联合类型的声明
union Un
{
char c;
int i;
};
2.2联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)。
下面两个例题可以充分表明
联合的特点
例1
#include<stdio.h>
union Un
{
int i;
char c;
};
int main() {
union Un un;
// 下面输出的结果是一样的吗?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
return 0;
}
例2
#include<stdio.h>
union Un
{
int i;
char c;
};
int main() {
union Un un;
//下面输出的结果是什么?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
return 0;
}
我们已经对 联合(共用体)有了一定的了解下面这道例题是运用联合(共用体)的一道典例
我相信一定可以让你对联合(共用体)的理解加深。
例题:判断当前计算机的大小端存储
#include<stdio.h>
int check_sys()
{
union
{
int a;
char c;
}un = { .a = 1 };
return un.c;
}
int main()
{
if (check_sys())
{
printf("小端存储");
}
else
{
printf("大端存储");
}
return 0;
}
如果你对大小端存储不了解可以看本博主的这篇文章
图解:
2.3联合大小的计算
(1)联合的大小至少是最大成员的大小。
(2)当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
#include<stdio.h>
union Un1
{
char c[5];
int i;
};
int main()
{
printf("%d\n", sizeof(union Un1));
return 0;
}
要对齐到最大对齐数的整数倍
很明显浪费了3个字节。
如果你对最大对齐数不了解可以看本博主的这篇文章
以上为我个人的小分享,如有问题,欢迎讨论!!!