C++ 结构体:struct 的定义与结构体数组

📅 发布时间:2026/7/12 5:28:08 👁️ 浏览次数:
C++ 结构体:struct 的定义与结构体数组
C 结构体struct定义、用法与结构体数组从零基础到能写出常见场景带完整示例 对比 常见坑结构体是 C 中非常重要的用户自定义复合类型它让你能把不同类型的数据捆绑成一个整体非常适合表示“实体”学生、图书、坐标、员工等。1. 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[]更安全。2. 如何创建结构体变量 访问成员#includeiostream#includestringstructStudent{intid;std::string name;chargender;// M 或 Fintage;doublescore;};intmain(){// 创建方式1定义后声明Student s1;// 创建方式2定义时初始化最推荐Student s2{1001,张三,M,20,88.5};// C11 统一初始化推荐Student s3{1002,李四,F,19,92.0};// 访问成员用 . 点运算符s1.id1003;s1.name王五;s1.genderM;s1.age21;s1.score76.5;// 输出std::cout学号s1.id\n姓名s1.name\n性别s1.gender\n年龄s1.age\n分数s1.score\n;return0;}3. 结构体数组超级常用结构体数组 每个元素都是一个结构体适合存储一批同类对象比如一个班的所有学生。3.1 三种常见声明方式// 方式1固定大小最常见Student class1[5];// 5 个学生// 方式2初始化C11 统一初始化语法最清晰Student class2[4]{{1001,小明,M,20,85.0},{1002,小红,F,19,92.5},{1003,小刚,M,21,78.0},{1004,小丽,F,20,88.5}};// 方式3C11 统一初始化推荐可省略部分成员默认 0/空Student class3[3]{{1005,张伟},{},// 全部默认初始化{1007,刘洋,M,20,90.0}};3.2 遍历 操作结构体数组三种写法对比#includeiostream#includestringstructStudent{/* 同上 */};intmain(){Student students[5]{{1001,Alice,F,20,88.5},{1002,Bob,M,21,76.0},{1003,Carol,F,19,95.0},{1004,David,M,20,82.5},{1005,Eve,F,22,90.0}};// 写法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;}4. 结构体数组 vs 普通数组 对比为什么用 struct项目普通数组二维结构体数组优势说明数据含义students[30][5]Student stu[30]语义清晰.name vs [1]可读性差全是数字下标好.id .name .score代码维护性大幅提升类型安全容易越界或错位编译器检查成员类型减少 bug扩展性加一列要改所有代码加成员只需改 struct 定义后期维护友好5. 常见坑 注意事项面试/实际开发高频结构体大小 内存对齐structA{charc;inti;};// 大小通常 8 字节不是 5建议把大成员放前面或用#pragma pack(1)强制 1 字节对齐但慎用。不要在结构体里放大数组错char buf[8192];栈容易爆改用std::string或std::vectorchar初始化顺序C11 前必须按声明顺序初始化C11 后支持指定成员初始化 designated initializersC20 更完善Student s{.id1001,.nameTom,.score99.0};// C20结构体数组传参推荐void print(const Student arr[], int n)或void print(const std::vectorStudent v)不推荐直接传大数组栈开销大C vs C 的 struct 区别C 的 struct默认 public可以有成员函数、构造函数可以写structPoint{intx,y;doubledistance()const{returnstd::sqrt(x*xy*y);}};6. 小练习建议你敲一遍定义一个struct Book {std::string title; std::string author; double price; int stock;};创建包含 3 本书的结构体数组写函数找出最贵的书并打印写函数把所有库存 5 的书价格打 8 折希望这篇把 struct 和结构体数组的核心用法讲透了有哪部分还不太清楚想看带成员函数的 struct、vector 版本、还是排序/查找示例直接告诉我