C 语言实例 – 使用结构体(struct)(快速上手)

C 语言实例 – 使用结构体(struct):从零开始掌握数据组织的艺术

在学习 C 语言的过程中,你可能已经掌握了变量、数组、函数这些基础元素。但当你需要处理一组相关的数据时,比如一个学生的姓名、年龄、成绩,你会意识到:单个变量根本无法满足复杂数据的组织需求。这时,结构体(struct) 就成了你的得力助手。

结构体就像是一个“数据盒子”,可以把不同类型的数据打包在一起,形成一个逻辑完整的整体。它不是新语法,而是 C 语言中一种强大的数据组织方式。今天,我们就通过一系列真实可运行的 C 语言实例,带你一步步掌握结构体的使用方法。


什么是结构体?它为何如此重要?

结构体(struct)是 C 语言中用于定义自定义数据类型的机制。你可以把它想象成一个“模板”或“容器”,允许你将多个不同类型的变量组合成一个整体。

举个例子:一个学生的信息包括名字(字符串)、年龄(整数)、成绩(浮点数)。如果分别用三个变量存储,代码会变得杂乱无章。而使用结构体,你可以创建一个 Student 类型,把这三个字段封装在一起。

这不仅让代码更清晰,也方便传递和操作整个学生数据。就像你寄快递时,不会把衣服、书本、手机一个个分开打包,而是放进一个统一的包裹里。结构体就是那个“包裹”。


定义和声明结构体:创建你的数据模板

在 C 语言中,定义结构体的语法如下:

struct 结构体名 {
    数据类型 成员变量1;
    数据类型 成员变量2;
    // 可以继续添加更多成员
};

我们来创建一个表示“学生”的结构体:

struct Student {
    char name[50];      // 学生姓名,最多 50 个字符
    int age;            // 年龄,整数
    float score;        // 成绩,浮点数
};

这段代码定义了一个名为 Student 的结构体类型。注意,定义结构体并不分配内存,它只是告诉编译器“以后我要用这种格式来组织数据”。

✅ 小贴士:struct Student 是一种新类型,就像 intfloat 一样,可以用来声明变量。


声明结构体变量并赋值:让数据“活”起来

定义完结构体后,就可以声明变量了。就像造房子前先画好图纸,现在我们根据图纸“建”出具体的学生对象。

// 声明一个 Student 类型的变量
struct Student student1;

// 给成员赋值
strcpy(student1.name, "张三");     // 使用字符串复制函数
student1.age = 20;
student1.score = 88.5;

⚠️ 注意:strcpy 函数需要包含头文件 <string.h>,否则编译会报错。

你也可以在声明时直接初始化:

struct Student student2 = {
    "李四",
    21,
    92.0
};

这种写法更简洁,尤其适合初始化少量数据。


使用结构体数组:批量管理数据

当你要管理多个学生信息时,使用结构体数组就非常方便了。

// 定义一个包含 3 个学生的数组
struct Student class[3] = {
    {"王五", 19, 76.5},
    {"赵六", 20, 90.0},
    {"钱七", 22, 85.3}
};

现在,class[0] 是第一个学生,class[1] 是第二个……就像一个“学生名单表格”。

我们可以遍历这个数组,打印所有学生信息:

#include <stdio.h>
#include <string.h>

int main() {
    struct Student class[3] = {
        {"王五", 19, 76.5},
        {"赵六", 20, 90.0},
        {"钱七", 22, 85.3}
    };

    // 遍历数组,打印每个学生信息
    for (int i = 0; i < 3; i++) {
        printf("学生 %d: 姓名=%s, 年龄=%d, 成绩=%.1f\n",
               i + 1,
               class[i].name,
               class[i].age,
               class[i].score);
    }

    return 0;
}

输出结果:

学生 1: 姓名=王五, 年龄=19, 成绩=76.5
学生 2: 姓名=赵六, 年龄=20, 成绩=90.0
学生 3: 姓名=钱七, 年龄=22, 成绩=85.3

✅ 关键操作:用 . 操作符访问结构体成员,如 class[i].name


结构体作为函数参数:让数据“流动”起来

结构体不仅可以存储数据,还能作为函数参数传递,实现数据的封装与复用。

我们写一个函数,用来打印学生信息:

// 函数声明:接收一个 Student 类型的参数
void printStudent(struct Student s) {
    printf("姓名: %s\n", s.name);
    printf("年龄: %d\n", s.age);
    printf("成绩: %.1f\n", s.score);
    printf("--------------------\n");
}

调用这个函数:

int main() {
    struct Student student1 = {"小明", 18, 95.2};
    struct Student student2 = {"小红", 19, 88.0};

    printStudent(student1);  // 传递学生1
    printStudent(student2);  // 传递学生2

    return 0;
}

输出:

姓名: 小明
年龄: 18
成绩: 95.2
--------------------
姓名: 小红
年龄: 19
成绩: 88.0
--------------------

📌 重要说明:函数参数传递的是结构体的副本。如果想修改原数据,应使用指针(后面会讲)。


结构体与指针:高效操作大型数据

当结构体很大时(比如包含大量字符串或数组),每次复制都消耗内存和时间。这时,使用指针传递结构体就非常高效。

// 使用指针传递结构体,避免复制
void modifyScore(struct Student *s, float newScore) {
    s->score = newScore;  // 通过 -> 操作符访问指针所指的成员
}

int main() {
    struct Student student = {"小刚", 20, 80.0};

    printf("修改前成绩: %.1f\n", student.score);

    modifyScore(&student, 92.5);  // 传入地址

    printf("修改后成绩: %.1f\n", student.score);

    return 0;
}

输出:

修改前成绩: 80.0
修改后成绩: 92.5

s->score 等价于 (*s).score,但 -> 更简洁,是 C 语言中操作结构体指针的标准语法。


嵌套结构体:构建更复杂的模型

现实中的数据往往具有层次关系。比如,一个“课程”信息不仅包含名称和学分,还包含“授课教师”信息。

我们可以用嵌套结构体来表示:

// 定义教师结构体
struct Teacher {
    char name[30];
    int yearsOfExperience;
};

// 定义课程结构体,嵌套教师结构体
struct Course {
    char courseName[50];
    int credits;
    struct Teacher instructor;  // 嵌套结构体成员
};

int main() {
    struct Course course1 = {
        "C 语言程序设计",
        3,
        {"陈老师", 10}
    };

    printf("课程名: %s\n", course1.courseName);
    printf("学分: %d\n", course1.credits);
    printf("授课教师: %s, 教龄: %d 年\n",
           course1.instructor.name,
           course1.instructor.yearsOfExperience);

    return 0;
}

输出:

课程名: C 语言程序设计
学分: 3
授课教师: 陈老师, 教龄: 10 年

✅ 嵌套结构体让数据模型更贴近现实,是构建复杂系统的基础。


结构体的常见误区与最佳实践

在使用结构体时,初学者常犯几个错误:

误区 正确做法
忘记包含 <string.h> 头文件使用 strcpy 始终包含 #include <string.h>
= 直接赋值大结构体 memcpy 或逐个成员赋值,避免意外
忽略数组大小,导致缓冲区溢出 为字符串成员分配足够空间,如 char name[50]
混淆 .-> 操作符 普通变量用 .,指针用 ->

✅ 建议:为字符串成员设置合理大小,避免越界。例如 char name[50] 可容纳 49 个字符 + 1 个结束符。


总结:C 语言实例 – 使用结构体(struct)的完整旅程

通过本篇文章,你已经掌握了结构体的核心用法:

  • 如何定义结构体模板
  • 如何声明变量并初始化
  • 如何使用结构体数组批量管理数据
  • 如何将结构体作为函数参数传递
  • 如何使用指针高效操作结构体
  • 如何嵌套结构体构建复杂数据模型

这些技能不仅在学习 C 语言时至关重要,也广泛应用于操作系统、嵌入式开发、游戏引擎等底层系统中。掌握结构体,就等于掌握了“组织数据”的基本功。

无论你是初学者还是中级开发者,只要在项目中遇到“一组相关数据”的场景,就该想到结构体。它不是语法糖,而是 C 语言中数据建模的核心工具。

继续练习这些 C 语言实例 – 使用结构体(struct)的代码,动手写一写,改一改,你会发现,编程的逻辑感和结构感,正是从这些“小盒子”里生长出来的。

保持练习,你终将写出优雅、高效、可维护的 C 代码。