C语言结构体与共用体
大约 2 分钟
C 语言结构体、共用体与枚举
配套Demo:codes/05_结构体.c
结构体
结构体将多个不同类型的变量组合成一个整体,是"自定义类型"的基础。
定义与使用
// 先定义结构体类型,再定义变量
struct Student
{
int id;
char name[20];
float score;
};
struct Student stu1 = {1, "张三", 92.5};
struct Student stu2; // 定义在函数内部时未初始化,内容为随机值
// 定义类型的同时定义变量
struct Point
{
int x;
int y;
} p1 = {3, 4}, p2;
// 匿名结构体(只能用这一次)
struct
{
int a, b;
} temp;
// 访问成员:变量用 . ,指针用 ->
stu2.id = 2;
strcpy(stu2.name, "李四");
printf("%s 的成绩是 %.1f\n", stu1.name, stu1.score);
typedef 起别名
typedef struct Student
{
int id;
char name[20];
float score;
} Student; // 以后写 Student 即可,不用再带 struct 关键字
Student stu = {1, "张三", 92.5};
结构体指针
Student stu = {1, "张三", 92.5};
Student *p = &stu;
printf("%d\n", p->id); // p->id 等价于 (*p).id
printf("%s\n", p->name);
p->score = 95.0; // 通过指针修改成员
结构体与函数
// 值传递:拷贝整个结构体,开销大
void printStudent(Student s)
{
printf("%s: %.1f\n", s.name, s.score);
}
// 地址传递:高效,且可在函数内修改原结构体
void addScore(Student *s, float delta)
{
s->score += delta;
}
共用体(union)
所有成员共享同一段内存,同一时刻只能有效保存一个成员的值,大小等于最大成员的大小:
union Data
{
int i;
float f;
char str[8];
};
union Data d;
d.i = 10;
printf("%d\n", d.i); // 10
d.f = 3.14f; // 赋值 f 后,i 的值已被覆盖,不再有效
printf("%zu\n", sizeof(union Data)); // 8,最大成员的字节数
典型应用:解析二进制数据、寄存器按字节/按字访问。
枚举
enum Week { MON, TUE, WED, THU, FRI, SAT, SUN };
// 枚举值默认从 0 开始,也可手动指定
enum Color { RED = 1, GREEN = 5, BLUE };
enum Week today = WED;
printf("%d\n", today); // 2
枚举本质是 int 常量,比
#define多了类型检查,常用于状态机、错误码定义。
位域
精确控制成员占用的二进制位,常用于底层协议、硬件寄存器:
struct Flags
{
unsigned int isOn : 1; // 1 位
unsigned int mode : 3; // 3 位,可表示 0~7
unsigned int id : 8; // 8 位
};
struct Flags f = {1, 5, 200};
printf("%zu\n", sizeof(f)); // 4,三个成员共占 12 位,装进一个 int
Loading...
