目录
一、枚举
1.解释
C语言中,枚举(enum)是一种用户自定义的数据类型,它允许你为一组相关的整数值指定名称。
2.基本语法
enum 枚举名 { 枚举元素列表 };
其中,枚举名是枚举类型的名称,枚举元素列表是枚举元素的列表,每个元素之间用逗号分隔。每个枚举元素都是该枚举类型的一个值。
3.举例
在这个例子中,我们定义了一个名为Weekdays的枚举类型,它包含了一周中的7天。
enum Weekdays { Mon,
Tue,
Wed,
Thu,
Fri,
Sat,
sun };
我们可以使用这个枚举类型来创建枚举变量并为其赋值:
int main()
{
enum Weekdays today = Mon;
printf("%d\n",today);
}
枚举会为第一个常量赋值0,然后其他常量依次+1。
当然,也可以手动为枚举常量赋值。
enum Weekdays
{
Mon = 1,
Tue,
Wed,
Thu,
Fri,
Sat,
Sun,
};
int main()
{
enum Weekdays today = Tue;
printf("%d\n", today);
}
4. 优点
首先,枚举可以提高代码的可读性和可维护性。使用枚举类型代替整型常量,可以让代码更加清晰易懂,方便程序员阅读和理解。同时,当需要修改代码中的常量时,只需要在枚举定义中修改即可,而不需要在程序的其它地方寻找所有使用了这个常量的地方并逐个修改。
其次,枚举可以避免程序员错误地使用某个无效或不被允许的值。枚举类型的数据是常量,本质上是不可修改的,即一开始是什么值,到结果还是什么值。不能通过赋值运算符给它重新赋值。因此,使用枚举可以防止程序员不小心修改了常量的值。
此外,枚举还可以提供更加清晰的代码语义。枚举类型的名称可以直观地表示它所包含的元素,比如上面例子中的Weekdays
枚举类型就表示它包含了一周中的7天。这样可以让代码更加易于理解和修改。
总之,枚举在C语言中可以提高代码的可读性和可维护性,避免程序员错误地使用某个无效或不被允许的值,以及提供更加清晰的代码语义。
二、 联合
1.解释
在C语言中,联合(union)是一种特殊的数据类型,可以存储不同类型的数据,但在任何时候只能存储其中一个成员的值。联合在内存中占据一定的空间,但只有一个成员在这个空间中起作用。
2.举例
在这个例子中,我们定义了一个名为ExampleUnion的联合,它有三个成员:一个整数i,一个浮点数f,和一个字符c。这个联合的大小将是足够大以容纳其最大的成员。在这个例子中,由于float类型占用的空间是最大的,所以整个联合的大小将是4个字节(在大多数现代系统上)。
union ExampleUnion {
int i;
float f;
char c;
};
首先创建了一个ExampleUnion类型的变量ex。然后,我们可以通过.运算符来访问联合的成员。我们可以先设置ex.i的值,然后打印它;然后我们可以设置ex.f的值,然后打印它;最后,我们可以设置ex.c的值,然后打印它。在每个步骤中,只有当前设置的成员有值,其他成员的值将被覆盖。赋值范围绝不能超出联合的最大成员的大小。
union ExampleUnion ex;
ex.i = 10; // 设置整数值
printf("%d\n", ex.i); // 打印整数值,输出:10
ex.f = 10.5; // 设置浮点数值
printf("%f\n", ex.f); // 打印浮点数值,输出:10.500000
ex.c = 'A'; // 设置字符值
printf("%c\n", ex.c); // 打印字符值,输出:A
3.类比
为何联合的大小是最大类型变量的大小呢?以及成员的值为何被新值覆盖?它跟结构体有何不同。
首先
定义一个新的结构体和联合体,并计算整体的大小。
struct S
{
int i;
float f;
char c;
};
union U
{
int i;
float f;
char c;
};
int main()
{
struct S s;
union U u;
printf("结构体:%d\n", sizeof(s));
printf("联合体:%d\n", sizeof(u));
}
结果显示,虽然二者的成员变量相同,但是所占空间大小却是不同的。
其次
打印联合中的每个成员的地址,发现联合成员的首地址是重叠的。
union U {
int i;
float f;
char c;
};
int main()
{
union U u;
printf("&u.i %d\n", &u.i);
printf("&u.f %d\n", &u.f);
printf("&u.c %d\n", &u.c);
return 0;
}
得出结论:
联合中的成员是公用一块空间的。
联合的大小取决于内部存储最大成员的大小。
4.小用处
可以使用联合轻松判断当前系统的存储方式(大端/小端)
union Un
{
int a;
char c;
};
int main()
{
union Un u;
u.a = 1;
if (u.c = 1)
printf("小端\n");
else if (u.c = 0)
printf("大端\n");
return 0;
}
通过调试,发现联合u的第一个字节存储的是01
结果显示为小端存储。此处利用了联合各成员公用空间的特性。
5.应用场景
- 内存共享:联合允许在同一块内存中存储不同的数据类型,达到节省空间的目的。每次只能赋一种值,赋入新值则冲去旧值。
- 实现变长数据结构:使用联合可以创建变长的数据结构,这在处理不同长度的数据时非常有用,例如在处理来自不同源头或格式的数据时。
- 多态性:在面向对象编程中,联合可以用于实现多态性。通过使用联合,可以在同一对象中使用不同的数据类型,这使得对象能够适应不同的数据类型和操作。
- 数据封装和抽象:联合可以用于封装和抽象数据类型。通过定义包含联合的结构体,可以创建一个包含不同数据类型的封装数据类型。这种用法可以帮助实现更高级别的抽象和封装。
看到这里,不妨点个攒,关注一下吧!
最后,谢谢你的观看