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...