引言
本文将详细介绍C语言中的三种重要复合数据类型——结构体(struct)、共用体(union) 和 枚举(enum)。这些高级特性广泛应用于实际编程中,掌握它们有助于编写更复杂且高效的程序。我们将结合具体实例讲解每种类型的定义方式、应用场景及其特点。
一、结构体(Struct)
(一)概念介绍
结构体是一种用户自定义的数据类型,它允许我们把不同类型的数据组织在一起作为一个整体处理。例如,一个人的名字、年龄和性别都可以被封装在一个person
结构体中。
(二)定义方法
struct Student {
char name[32]; // 学生姓名
int age; // 年龄
float score; // 分数
};
(三)创建与初始化
可以通过以下几种方式创建结构体对象:
- 即时初始化:
struct Student s1 = {"张三", 20, 90.5f};
- 分步设置成员属性:
struct Student s2; strcpy(s2.name, "李四"); s2.age = 21; s2.score = 85.5f;
(四)访问成员
使用.
操作符访问结构体内部成员:
printf("Name:%s Age:%d Score:%f\n", s1.name, s1.age, s1.score);
(五)结构体数组
当需要管理大量相同类型的对象时,可以定义结构体数组:
struct Student students[3] = {
{"王五", 22, 88},
{"赵六", 23, 92},
{"孙七", 24, 95}
};
(六)结构体嵌套
结构体之间还可以相互嵌套,形成更加复杂的层次关系:
struct Address {
char city[32];
char street[64];
};
struct Person {
char name[32];
int age;
struct Address addr; // 内部嵌套另一个结构体
};
二、共用体(Union)
(一)基本原理
与结构体不同的是,共用体在同一时刻只保留其中一个成员的内容,即所有成员共享同一段内存区域。这使得共用体非常适合用于节省空间或实现多态性。
(二)定义语法
union Data {
int intValue;
float floatValue;
char strValue[32];
};
(三)注意事项
由于共用体会复用内存空间,因此每次读取前都需要明确当前有效的是哪个字段,否则可能会得到意外的结果。
示例:测试CPU大/小端模式
union EndianTest {
uint32_t value;
uint8_t bytes[4];
};
int check_endianess(void){
union EndianTest test={0x12345678};
return test.bytes[0]==0x78?LITTLE_ENDIAN:BIG_ENDIAN;
}
三、枚举(Enum)
(一)作用范围
枚举类型主要用于定义一组具有固定含义的符号常量集合。相比于传统的宏定义,枚举提供了更好的可读性和维护性。
(二)定义形式
enum WeekDays {
SUNDAY = 0,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
这里需要注意,默认情况下第一个枚举值从0开始递增;但如果显式设置了初始值,则后续元素将基于此继续累加。
(三)实际应用
枚举经常出现在状态机、配置选项等方面,帮助开发者清晰表达逻辑意图。