一、开篇回顾 & 本期目标
不知不觉我们已经走到本系列最后一期啦。
前面八期,我们依次掌握了:开发环境、变量、运算符、判断、循环、数组、字符串、函数、指针。能存数字、存文字、能写独立功能、能拆分模块化代码。
但现实生活里,一组信息往往是混搭的:比如一名学生,既有数字学号、小数分数,又有文字姓名。普通数组只能存同一种数据,单纯拼一堆变量又杂乱难维护。
C 语言专门用 结构体 struct 解决这个问题:把不同类型的数据打包成一个整体,用来描述「一条完整记录」。
本期作为入门系列收尾,目标:
前置要求:熟练数组、字符串、循环、自定义函数。
二、大白话讲透:什么是结构体
举个生活例子,很好理解:
每个人都有个人档案:姓名、年龄、身高、手机号。
- 姓名:文字(字符串)
- 年龄:整数
- 身高:小数
这一组信息类型各不相同,但又属于同一个人。在代码里,我们就可以用结构体,把这一堆数据打包在一起,当成一个全新的 “自定义数据类型” 来使用。
简单总结:
- int 只能存整数,char 只能存字符;
- 结构体可以自由组合多种类型数据,用来描述一个完整事物。
三、结构体基础语法
1. 定义结构体类型
格式固定,先定义模板,再创建变量。
struct 结构体名
{
成员列表; // 里面可以写 int / char / float / 字符数组
};
⚠️ 重点:大括号后面必须加分号,这是新手最容易漏掉的地方。
我们以「学生」为例,定义一个标准结构体:
// 定义学生结构体模板
struct Student
{
char name[20]; // 姓名(字符串)
int id; // 学号(整数)
float score; // 分数(小数)
};
2. 定义结构体变量
有了模板,就像有了图纸,可以创建实体变量:
// 方式1:单独定义变量(最常用)
struct Student stu1;
struct Student stu2;
3. 访问结构体成员
想要操作内部的姓名、学号、分数,用 英文小数点 .格式:结构体变量名.成员名
4. 最简演示案例
#include <stdio.h>
#include <string.h>
// 1. 定义结构体模板
struct Student
{
char name[20];
int id;
float score;
};
int main(void)
{
// 2. 创建结构体变量
struct Student stu;
// 3. 给成员赋值
stu.id = 202601;
stu.score = 89.5f;
strcpy(stu.name, "ZhangSan"); // 字符串必须用 strcpy
// 4. 读取输出
printf("===== 单条学生信息 =====\\n");
printf("学号:%d\\n", stu.id);
printf("姓名:%s\\n", stu.name);
printf("分数:%.2f\\n", stu.score);
return 0;
}
运行结果:
===== 单条学生信息 =====
学号:202601
姓名:ZhangSan
分数:89.50
补充:结构体快速初始化
定义变量时直接赋值,一行写完:
struct Student stu = {"LiSi", 202602, 92.0f};
四、核心进阶:结构体数组
单个结构体只能存一条信息,如果要管理全班几十个学生,就要用 结构体数组。
理解:普通数组存放普通变量,结构体数组里每一个元素,都是一整条学生信息。
基础示例
#include <stdio.h>
#include <string.h>
struct Student
{
char name[20];
int id;
float score;
};
int main(void)
{
// 结构体数组:存放3名学生
struct Student stuArr[3] = {
{"ZhangSan", 202601, 88.0f},
{"LiSi", 202602, 95.5f},
{"WangWu", 202603, 76.0f}
};
int i;
// 循环遍历输出
for(i = 0; i < 3; i++)
{
printf("学号:%d 姓名:%s 分数:%.2f\\n",
stuArr[i].id, stuArr[i].name, stuArr[i].score);
}
return 0;
}
运行效果:
学号:202601 姓名:ZhangSan 分数:88.00
学号:202602 姓名:LiSi 分数:95.50
学号:202603 姓名:WangWu 分数:76.00
五、知识点整合:结构体做函数参数
延续我们一直坚持的模块化思想,把录入、查看功能单独封装成函数,结构体数组可以直接作为参数传递。
这也是后期做项目的标准写法。
六、本期终极实战:菜单版学生信息管理系统(系列收官项目)
整合:结构体 + 结构体数组 + 循环 + 分支判断 + 字符串 + 函数完整功能:
完整可直接运行代码
#include <stdio.h>
#include <string.h>
// 1. 定义学生结构体
struct Student
{
char name[20];
int id;
float score;
};
// 最大学生人数
const int MAX_STU = 5;
// 全局结构体数组(存放所有学生信息)
struct Student stuArr[MAX_STU];
// 函数声明
void inputInfo();
void showInfo();
int main(void)
{
int choice;
printf("===== 学生信息管理系统(入门收官项目)=====\\n");
// 主菜单循环
while(1)
{
printf("\\n请选择功能:\\n");
printf("1. 录入学生信息\\n");
printf("2. 查看全部信息\\n");
printf("0. 退出系统\\n");
printf("请输入选择:");
scanf("%d", &choice);
if(choice == 1)
{
inputInfo();
}
else if(choice == 2)
{
showInfo();
}
else if(choice == 0)
{
printf("系统已退出,感谢使用!\\n");
break;
}
else
{
printf("输入无效,请选择 0~2!\\n");
}
}
return 0;
}
// 录入所有学生信息
void inputInfo()
{
int i;
printf("\\n—– 开始录入信息 —–\\n");
for(i = 0; i < MAX_STU; i++)
{
printf("第%d位学生:\\n", i + 1);
printf("姓名:");
scanf("%s", stuArr[i].name);
printf("学号:");
scanf("%d", &stuArr[i].id);
printf("分数:");
scanf("%f", &stuArr[i].score);
}
printf("信息录入完成!\\n");
}
// 展示所有学生信息
void showInfo()
{
int i;
printf("\\n—– 全部学生列表 —–\\n");
for(i = 0; i < MAX_STU; i++)
{
printf("学号:%d 姓名:%s 分数:%.2f\\n",
stuArr[i].id, stuArr[i].name, stuArr[i].score);
}
}
运行演示
===== 学生信息管理系统(入门收官项目)=====
请选择功能:
1. 录入学生信息
2. 查看全部信息
0. 退出系统
请输入选择:1
—– 开始录入信息 —–
第1位学生:
姓名:XiaoMing
学号:202601
分数:90
第2位学生:
姓名:XiaoHong
学号:202602
分数:85.5
……
请选择功能:
1. 录入学生信息
2. 查看全部信息
0. 退出系统
请输入选择:2
—– 全部学生列表 —–
学号:202601 姓名:XiaoMing 分数:90.00
学号:202602 姓名:XiaoHong 分数:85.50
请选择功能:
……
请输入选择:0
系统已退出,感谢使用!
七、本期新手高频踩坑合集(必收藏)
1. 结构体定义末尾漏写分号
struct Student
{
char name[20];
int id;
}; // 这里 ; 绝对不能丢
2. 结构体字符串成员直接赋值
❌ 错误:stu.name = "abc";✅ 正确:必须使用 strcpy(stu.name, "abc");
3. 混淆 & 取地址符
- 普通数字成员:scanf("%d", &stu.id); 必须加 &
- 字符数组成员:scanf("%s", stu.name); 不加 &
4. 成员访问符号写错
只能用英文小数点 .,不要用逗号、顿号、括号。
5. 结构体数组下标越界
和普通数组规则一致,下标从 0 开始,不要超出预设长度。
八、拓展小练习(自主提升)
在收官项目基础上自行改造,巩固全套知识点:
九、全篇总结 + 系列完整收官
1. 本期知识点总结
2. 全系列 9 期整体回顾
到这里,《新手学 C 别死啃语法》实战入门系列 正式完结!我们从零开始,一步步走完 C 语言入门全部核心内容:
全程没有死啃厚书本、没有堆砌枯燥理论,以实战代码驱动学习,从一行简单代码,一步步做到完整小型项目。
能跟着坚持到最后,说明你已经稳稳拿下 C 语言入门!
十、后续学习路线建议(按需进阶)
入门结束后,可以根据自己的方向继续深耕:
十一、寄语
编程是一门越动手、越熟练的技能。入门只是起点,多敲代码、多改功能、多排查问题,水平才会稳步提升。
感谢大家一路陪伴学习,本系列到此圆满结束。后续进阶内容、实战项目、问题答疑,我们继续交流!