news 2026/4/18 5:35:19

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 结构体:struct 的定义与结构体数组

C++ 结构体(struct):定义、用法与结构体数组
(从零基础到能写出常见场景,带完整示例 + 对比 + 常见坑)

结构体是 C++ 中非常重要的用户自定义复合类型,它让你能把不同类型的数据捆绑成一个整体,非常适合表示“实体”(学生、图书、坐标、员工等)。

1. struct 的基本定义方式(3 种常见写法)

写法代码示例特点推荐场景
方式1:最规范、最常用```cpp
方式2:定义时顺便声明变量(C 风格遗留)cpp<br>struct Student {<br> int id;<br> // ...<br>} stu1, stu2;<br>定义类型的同时创建变量快速测试、小脚本
方式3:匿名结构体(极少用)cpp<br>struct {<br> int x, y;<br>} point;<br>没有类型名,只能用一次临时小结构

现代 C++ 推荐:方式1 + 使用std::string而不是char[](更安全)。

2. 如何创建结构体变量 & 访问成员

#include<iostream>#include<string>structStudent{intid;std::string name;chargender;// 'M' 或 'F'intage;doublescore;};intmain(){// 创建方式1:定义后声明Student s1;// 创建方式2:定义时初始化(最推荐)Student s2={1001,"张三",'M',20,88.5};// C++11 统一初始化(推荐)Student s3{1002,"李四",'F',19,92.0};// 访问成员:用 . 点运算符s1.id=1003;s1.name="王五";s1.gender='M';s1.age=21;s1.score=76.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:初始化(C++11 统一初始化语法最清晰)Student class2[4]={{1001,"小明",'M',20,85.0},{1002,"小红",'F',19,92.5},{1003,"小刚",'M',21,78.0},{1004,"小丽",'F',20,88.5}};// 方式3:C++11 统一初始化(推荐,可省略部分成员,默认 0/空)Student class3[3]{{1005,"张伟"},{},// 全部默认初始化{1007,"刘洋",'M',20,90.0}};
3.2 遍历 & 操作结构体数组(三种写法对比)
#include<iostream>#include<string>structStudent{/* 同上 */};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(inti=0;i<5;i++){std::cout<<students[i].id<<"\t"<<students[i].name<<"\t"<<students[i].score<<"\n";}// 写法2:范围 for(C++11+,最现代、最推荐)std::cout<<"\n范围 for(只读):\n";for(constauto&stu:students){// const & 防止拷贝std::cout<<stu.id<<"\t"<<stu.name<<"\t"<<stu.score<<"\n";}// 写法3:范围 for + 可修改std::cout<<"\n范围 for + 修改分数+5:\n";for(auto&stu:students){stu.score+=5;std::cout<<stu.name<<" 新分数:"<<stu.score<<"\n";}return0;}

4. 结构体数组 vs 普通数组 对比(为什么用 struct)

项目普通数组(二维)结构体数组优势说明
数据含义students[30][5]Student stu[30]语义清晰(.name vs [1])
可读性差(全是数字下标)好(.id .name .score)代码维护性大幅提升
类型安全容易越界或错位编译器检查成员类型减少 bug
扩展性加一列要改所有代码加成员只需改 struct 定义后期维护友好

5. 常见坑 & 注意事项(面试/实际开发高频)

  1. 结构体大小 & 内存对齐

    structA{charc;inti;};// 大小通常 8 字节(不是 5)

    建议:把大成员放前面,或用#pragma pack(1)强制 1 字节对齐(但慎用)。

  2. 不要在结构体里放大数组
    错:char buf[8192];(栈容易爆)
    改:用std::stringstd::vector<char>

  3. 初始化顺序
    C++11 前:必须按声明顺序初始化
    C++11 后:支持指定成员初始化( designated initializers,C++20 更完善)

    Student s{.id=1001,.name="Tom",.score=99.0};// C++20
  4. 结构体数组传参

    • 推荐:void print(const Student arr[], int n)void print(const std::vector<Student>& v)
    • 不推荐直接传大数组(栈开销大)
  5. C++ vs C 的 struct 区别

    • C++ 的 struct默认 public,可以有成员函数、构造函数
    • 可以写:
      structPoint{intx,y;doubledistance()const{returnstd::sqrt(x*x+y*y);}};

6. 小练习(建议你敲一遍)

  1. 定义一个struct Book {std::string title; std::string author; double price; int stock;};
  2. 创建包含 3 本书的结构体数组
  3. 写函数:找出最贵的书,并打印
  4. 写函数:把所有库存 < 5 的书价格打 8 折

希望这篇把 struct 和结构体数组的核心用法讲透了!
有哪部分还不太清楚?想看带成员函数的 struct、vector 版本、还是排序/查找示例?直接告诉我~ 😄

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 9:32:29

高校毕业生就业管理系统(11846)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/4/13 17:16:37

高校隔离宿舍管理系统(11847)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/4/5 10:10:12

震惊!这3个Chrome插件让BUG无处藏身

一、痛点直击&#xff1a;测试员的效率困局 重复操作陷阱&#xff1a;手工回归测试耗时占比超60%&#xff0c;易因操作惯性遗漏边界场景 接口验证盲区&#xff1a;传统工具难以实时模拟复杂参数组合&#xff0c;32%逻辑缺陷因此逃逸 性能认知偏差&#xff1a;本地环境与生产环…

作者头像 李华
网站建设 2026/3/27 21:07:50

基于Spring Boot的培训机构信息管理系统设计与实现(开题报告)

毕业论文(设计)开题报告基于Spring Boot的培训机构信息管理系统设计与实现 姓 名 学 院 数学与数据科学学院 专业班级 信息与计算科学212班 学 号 指导教师 职称/职务 副教授 技术经理 起始时间 2024年 10 月 10 日 教务部制 一、开题依据(研究目的、意义及国内外研究…

作者头像 李华
网站建设 2026/4/17 5:27:12

Halo的“傻瓜建站魔法”:cpolar内网穿透实验室第637个成功挑战

Halo 是一款专注于简化建站流程的工具&#xff0c;核心功能是帮助用户快速搭建个人博客或网站&#xff0c;无论是零基础的学生、刚入门的内容创作者&#xff0c;还是需要展示作品集的设计师&#xff0c;都能轻松上手。它的优点很突出&#xff1a;界面设计简洁直观&#xff0c;像…

作者头像 李华
网站建设 2026/4/15 13:09:09

FLAC3D隧道开挖面失稳模拟

flac3d隧道开挖面失稳模拟。 凌晨三点的办公室键盘声格外清脆&#xff0c;我盯着屏幕上跳动的应力云图&#xff0c;红色区域像癌细胞扩散般在隧道掌子面蔓延。这已经是第三次调整参数了&#xff0c;混凝土衬砌的位移量还是超过警戒值。FLAC3D的黑色命令行窗口不断吐出计算日志&…

作者头像 李华