当前位置: 首页 > news >正文

结构体入门:高效封装数据的利器

一、什么是结构体?

  • 结构体是用户自定义的数据类型
  • 可以把多个不同类型的变量打包在一起
  • 用来描述一个完整的对象:学生、员工、点、书籍、游戏角色等

比如一个学生包含:学号(int)、姓名(string)、年龄(int)、成绩(double)用结构体就能整合成一个类型Student


二、结构体定义语法

struct 结构体名 { 成员1类型 成员1名; 成员2类型 成员2名; 成员3类型 成员3名; }; // 注意末尾必须有分号

示例:定义学生结构体

struct Student { int id; // 学号 string name; // 姓名 int age; // 年龄 double score; // 成绩 };

三、结构体变量定义与初始化

1. 定义时初始化

Student stu = {1001, "张三", 18, 90.5};

2. 先定义,后赋值

通过.成员访问符赋值

Student stu; stu.id = 1002; stu.name = "李四"; stu.age = 19; stu.score = 88.0;

3. 访问成员

cout << stu.id << endl; cout << stu.name << endl; cout << stu.age << endl; cout << stu.score << endl;

四、结构体数组

存储多个同类对象,比如一个班所有学生:

Student stuArr[3] = { {1001, "张三", 18, 90.5}, {1002, "李四", 19, 88.0}, {1003, "王五", 20, 95.0} };

遍历:

for (int i = 0; i < 3; i++) { cout << stuArr[i].id << " " << stuArr[i].name << " " << stuArr[i].score << endl; }

五、结构体与函数

1. 结构体作为函数参数(值传递)

void printStudent(Student s) { cout << s.name << " " << s.score << endl; }

调用:

Student s = {1001, "张三", 18, 90.5}; printStudent(s);

2. 结构体引用传参(推荐,不拷贝、效率高)

void setScore(Student &s, double newScore) { s.score = newScore; }

这样可以直接修改原结构体,且效率更高。

3. 结构体指针(-> 用法)

指针访问成员用->,不用.

Student s = {1001, "张三", 18, 90.5}; Student *p = &s; cout << p->name << endl; cout << p->score << endl;

六、完整综合实战案例

#include <iostream> #include <string> using namespace std; // 1. 定义结构体 struct Student { int id; string name; int age; double score; }; // 打印学生信息 void show(Student s) { cout << "学号:" << s.id << " 姓名:" << s.name << " 成绩:" << s.score << endl; } // 查找最高分学生 void findMax(Student arr[], int len) { int maxIndex = 0; for (int i = 1; i < len; i++) { if (arr[i].score > arr[maxIndex].score) { maxIndex = i; } } cout << "最高分是:"; show(arr[maxIndex]); } int main() { // 结构体数组 Student stuArr[3] = { {1001, "张三", 18, 90.5}, {1002, "李四", 19, 88.0}, {1003, "王五", 20, 95.0} }; // 遍历 for (int i = 0; i < 3; i++) { show(stuArr[i]); } // 找最高分 findMax(stuArr, 3); system("pause"); return 0; }

七、结构体 vs 数组(对比理解)

  • 数组:多个相同类型数据的集合
  • 结构体:多个不同类型数据的集合
  • 结构体数组:多个对象的集合

八、新手高频易错点

  1. 结构体定义末尾忘记写;
  2. 成员访问混淆.->
    • 普通变量用.
    • 指针变量用->
  3. 结构体直接比较==(不允许,要逐个成员比较)
  4. 结构体传参太大,不使用引用导致效率低
  5. 成员赋值顺序与定义顺序不一致

九、今日重点总结

  1. 结构体 = 自定义类型,可封装不同类型成员
  2. 访问成员:普通变量用.,指针用->
  3. 结构体数组可表示一组对象
  4. 函数传参推荐用const 引用高效安全
  5. 是面向对象编程的基础雏形
http://www.cnnetsun.cn/news/1983846.html

相关文章:

  • 从PID到MPC:用Python和Udacity代码实战,聊聊无人车控制算法的那些坑
  • 解锁Windows原生HEIC缩略图预览能力:告别iPhone照片无法识别的困扰
  • 别再死记硬背CNN和RNN了!聊聊‘归纳偏置’这个让模型变聪明的‘潜规则’
  • 新手避坑指南:用LAMMPS计算硅的晶格常数,从安装到出图保姆级教程
  • Orwell Dev-C++有哪些已知问题
  • 从Timed out到秒速开机:深入剖析systemd依赖链与设备等待超时
  • Arduino玩家进阶:用USBtinyISP替代Arduino板做ISP,解锁ATmega芯片自由编程
  • 实战指南:利用Application Verifier与WinDbg精准捕获Windows应用内存泄漏与堆损坏
  • FPGA数字信号处理实战:手把手教你用Vivado IP核搭建复数浮点乘法器(附完整代码)
  • 从画图‘倒色’到贪吃蛇禁区:Flood Fill算法在游戏开发中的实战应用(附Java代码)
  • 终极罗技PUBG鼠标宏技术解析:从原理到实战的完整指南
  • League-Toolkit终极指南:英雄联盟玩家的智能助手,一键提升游戏体验 [特殊字符]
  • AGI农业优化失效的5个致命盲区,92%农场主正在重复踩坑——资深AI农学家20年实战复盘
  • AGI客服从合规达标到体验溢价的临界点突破(含ISO/IEC 23894:2023适配清单)
  • 从校园卡到门禁:手把手教你用Proxmark3检测你手里的M1卡安全等级(附防复制建议)
  • 当AGI系统突然“说错话”引发股价单日暴跌18%,技术团队该在第3分钟做什么?
  • ESP32 BLE扫描实战:手把手教你用ESP-IDF API解析广播包里的设备名、UUID和自定义数据
  • 3步解锁电脑玩手机游戏:scrcpy让你的Android设备变身游戏主机
  • 手写企业级 Starter:ark-redis-starter(缓存 + 开关 + 降级策略)
  • 别再只盯着HTTP了!用Wireshark亲手抓一封邮件,看看SMTP/POP3协议是怎么“裸奔”的
  • 【NOIP】2000真题解析 luogu-P1017 进制转换
  • 相控阵天线(十三):旋转矢量法校准的工程化仿真与优化策略
  • 从LSTM到LLM-to-Action:SITS2026发布游戏智能演进年表(2018–2026),标注3次范式跃迁时刻及对应算力/数据拐点)
  • AGI语言生成可靠性危机(2024实测数据曝光:幻觉率仍高达37.6%)
  • 你的STM32键盘会“粘键”吗?深入解析USB HID报告发送时序与防误触技巧
  • Qt/C++ 信号阻塞的RAII实践:QSignalBlocker的进阶用法与场景剖析
  • 【虚幻引擎】UE4/UE5 容器实战指南:Map、Set、Array 的核心操作与性能考量
  • Sage-Husa自适应滤波:从理论到实战,如何应对动态噪声的挑战
  • GD32F105RBT6 Keil工程模板搭建全攻略(附LED闪烁调试)
  • 树莓派国内镜像源配置全攻略:从原理到实践