核心内容摘要
倾尽一生,只为那一声“黄忠我爱你”
C 结构体struct定义、用法与结构体数组从零基础到能写出常见场景带完整示例 对比 常见坑结构体是 C 中非常重要的用户自定义复合类型它让你能把不同类型的数据捆绑成一个整体非常适合表示“实体”学生、图书、坐标、员工等。
struct 的基本定义方式3 种常见写法写法代码示例特点推荐场景方式1最规范、最常用cpp方式2定义时顺便声明变量C 风格遗留cppbrstruct Student {br int id;br // ...br} stu1, stu2;br定义类型的同时创建变量快速测试、小脚本方式3匿名结构体极少用cppbrstruct {br int x, y;br} point;br没有类型名只能用一次临时小结构现代 C 推荐方式1 使用std::string而不是char[]更安全。
如何创建结构体变量 访问成员#includeiostream#includestringstructStudent{intid;std::string name;chargender;// M 或 Fintage;doublescore;};intmain(){// 创建方式1定义后声明Student s1;// 创建方式2定义时初始化最推荐Student s2{1001,张三,M,20,
8
5};// C11 统一初始化推荐Student s3{1002,李四,F,19,
9
0};// 访问成员用 . 点运算符s
id1003;s
name王五;s
genderM;s
age21;s
score
7
5;// 输出std::cout学号s
id\n姓名s
name\n性别s
gender\n年龄s
age\n分数s
score\n;return0;}
结构体数组超级常用结构体数组 每个元素都是一个结构体适合存储一批同类对象比如一个班的所有学生。
1 三种常见声明方式// 方式1固定大小最常见Student class1[5];// 5 个学生// 方式2初始化C11 统一初始化语法最清晰Student class2[4];// 方式3C11 统一初始化推荐可省略部分成员默认 0/空Student class3[3];
2 遍历 操作结构体数组三种写法对比#includeiostream#includestringstructStudent{/* 同上 */};intmain(){Student students[5];// 写法1普通 for 循环最直观std::cout普通 for 循环\n;for(inti0;i5;i){std::coutstudents[i].id\tstudents[i].name\tstudents[i].score\n;}// 写法2范围 forC11最现代、最推荐std::cout\n范围 for只读\n;for(constautostu:students){// const 防止拷贝std::coutstu.id\tstu.name\tstu.score\n;}// 写法3范围 for 可修改std::cout\n范围 for 修改分数5\n;for(autostu:students){stu.score5;std::coutstu.name 新分数stu.score\n;}return0;}
结构体数组 vs 普通数组 对比为什么用 struct项目普通数组二维结构体数组优势说明数据含义students[30][5]Student stu[30]语义清晰.name vs [1]可读性差全是数字下标好.id .name .score代码维护性大幅提升类型安全容易越界或错位编译器检查成员类型减少 bug扩展性加一列要改所有代码加成员只需改 struct 定义后期维护友好
常见坑
注意事项面试/实际开发高频结构体大小 内存对齐structA{charc;inti;};// 大小通常 8 字节不是 5建议把大成员放前面或用#pragma pack(
强制 1 字节对齐但慎用。
不要在结构体里放大数组错char buf[8192];栈容易爆改用std::string或std::vectorchar初始化顺序C11 前必须按声明顺序初始化C11 后支持指定成员初始化 designated initializersC20 更完善Student s{.id1001,.nameTom,.score
9