5.1 结构体

本篇学习结构体的定义、初始化、结构体数组与结构体指针,并能用结构体组织多字段数据。

结构体

概念说明

结构体用于把多个不同类型的字段组织成一个整体。 当一条数据不再只是单独的整数或字符串,而是“编号、姓名、成绩”这种多属性组合时,结构体就很适合。

结构体是 C 语言进行数据建模的重要方式。 后面的链表、树、网络包、配置项等复杂数据结构,很多都会以结构体为基础。

结构体既可以单独使用,也可以和数组、指针、函数参数组合。 所以学结构体时,不只是会写 struct,还要会处理结构体数组和结构体指针。

语法/规则

  1. 结构体定义形式是 struct 结构体名 { 字段列表 };
  2. 访问普通结构体变量成员使用 .,访问结构体指针成员使用 ->
  3. 结构体可以在定义时初始化,也可以后续逐个字段赋值。
  4. 结构体数组适合表示一组同构但多字段的数据。
  5. 结构体作为函数参数时可以按值传递,也可以传指针;数据较大时传指针更常见。
  6. 结构体内存布局可能包含对齐和填充,不能随意假设字段紧密排列。
  7. 如果结构体名称写起来太长,可以配合 typedef 提升可读性。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

struct Student {
    int id;
    double score;
};

int main(void) {
    struct Student group[2] = {
        {1001, 92.5},
        {1002, 87.0}
    };
    struct Student *first = &group[0];

    printf("first id = %d\n", first->id);
    printf("first score = %.1f\n", first->score);
    printf("second score = %.1f\n", group[1].score);
    return 0;
}

输出结果:

1
2
3
first id = 1001
first score = 92.5
second score = 87.0

常见错误

  1. 结构体变量和结构体指针混用,把 .-> 写反。
  2. 误以为结构体字段一定紧挨着排列,忽略了内存对齐和填充。
  3. 只图方便把无关字段全部塞进一个结构体,结果模型越来越混乱。
  4. 复制结构体时没有意识到这是按字段整体复制,而不是共享同一份对象。
  5. 结构体数组下标和成员访问一起使用时,没有先把表达式读清楚,导致访问错位。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字