目录
前言:
共用体union和enum(枚举)本身没有什么关系,但是enum枚举的定义和结构体,共用体都很相似,为了节约篇幅,本章一并解释讲解。
1.共用体定义:
2.共用体(Union)特点:
内存共享:
在共用体中,所有的成员共享同一块内存空间。这意味着,无论你在共用体中定义了多少个数据类型,所占用的内存大小仅为最大成员的数据类型的大小。例如,如果一个共用体包含一个整数(4字节)、一个浮点数(4字节)和一个字符数组(20字节),那么整个共用体只会占用20字节的内存。
只关心一个值:(最终赋值有效)
由于共用体的设计,你可能只会在某个时刻使用其中的一个成员。例如,一个程序可能需要处理多种类型的数据,但在某一时刻只需要知道其中之一的值。在这种情况下,使用共用体可以减少内存的浪费。
关于上述两点的解释,尤其第二点,以下是代码示例及解释:
#include <stdio.h>
#include <string.h>
// 定义共用体
union InputData {
int intValue;
float floatValue;
char strValue[20];
};
int main() {
union InputData data;
// 假设我们现在要处理一个整数
data.intValue = 42;
printf("Integer: %d\n", data.intValue);
// 现在我们要处理一个浮点数
data.floatValue = 3.14f;
printf("Float: %.2f\n", data.floatValue);
// 再换成一个字符串
strcpy(data.strValue, "Hello");
printf("String: %s\n", data.strValue);
// 注意:此时 intValue 和 floatValue 的值是不确定的,因为它们共享同一块内存
// 只有最后一个赋值的成员是有效的
return 0;
}
3.enum(枚举)
枚举用于表示有限且离散的值。例如,颜色、星期几、状态等,这些都是可以用枚举来表示的。
3.1 枚举的基本语法
EnumName:这是枚举的名称。
Constant1, Constant2, ...:这些是枚举成员,可以直接使用它们的名称,而不需要额外的值
enum EnumName {
Constant1,
Constant2,
Constant3,
...
};
如果没有显式指定枚举常量的值,C语言会自动为其赋值,第一个常量的默认值为0,后续常量的值会依次递增。例如:
enum Color {
RED, // 0
GREEN, // 1
BLUE=3 // 也可以显视地为成员赋值
};
3.2 枚举的特点
枚举的实际类型是整型,因此所有的枚举值都是整数。
枚举常量的作用域是全局的,在同一个文件内不能有两个相同名称的枚举常量。
枚举可以用作函数参数或返回值,使得函数接口更加明确,下面是关于枚举作为函数参数的代码示例:
#include <stdio.h>
// 定义天气状态的枚举
enum Weather {
SUNNY,
RAINY,
CLOUDY,
SNOWY
};
// 根据天气给出建议的函数
const char* getWeatherSuggestion(enum Weather weather) {
switch (weather) {
case SUNNY:
return "晒太阳";
case RAINY:
return "记得带伞";
case CLOUDY:
return "适合户外锻炼";
case SNOWY:
return "下雪路滑";
default:
return "未知天气";
}
}
int main() {
enum Weather today = SUNNY; // 设置今天的天气为晴天
// 调用函数并打印建议
printf("Weather suggestion: %s\n", getWeatherSuggestion(today));
return 0;
}