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

结构体指针与动态数组实战指南

一、结构体指针

指向结构体变量的指针,本质还是指针。

1. 定义

struct Student { int id; string name; double score; }; Student stu = {1001, "张三", 90.5}; // 结构体指针 Student *p = &stu;

2. 访问成员(重点符号 ->)

  • 结构体变量用.
  • 结构体指针用->
// 正确 cout << p->id << endl; cout << p->name << endl; cout << p->score << endl;

3. 利用指针修改成员

p->score = 95.0;

二、动态结构体数组(非常实用)

普通结构体数组长度固定,动态结构体数组可以在运行时指定人数,用 new 创建。

1. 创建

int n; cout << "请输入学生人数:"; cin >> n; // 动态开辟 n 个 Student Student *arr = new Student[n];

2. 访问方式

两种写法完全等价:

arr[i].name; // 或 (arr + i)->name;

3. 释放

cpp

运行

delete[] arr; arr = nullptr;

三、完整综合案例:学生管理系统(简易版)

功能:

  • 输入学生人数
  • 逐个录入信息
  • 遍历打印所有学生
  • 查找最高分学生
  • 释放动态内存
#include <iostream> #include <string> using namespace std; struct Student { int id; string name; double score; }; // 打印单个学生 void showStudent(Student *p) { cout << "学号:" << p->id << "\t姓名:" << p->name << "\t成绩:" << p->score << endl; } int main() { int n; cout << "请输入学生人数:"; cin >> n; // 动态开辟结构体数组 Student *arr = new Student[n]; // 录入信息 for (int i = 0; i < n; i++) { cout << "请输入第" << i + 1 << "个学生信息(id 姓名 成绩):" << endl; cin >> arr[i].id >> arr[i].name >> arr[i].score; } // 遍历输出 cout << "\n===== 学生列表 =====" << endl; for (int i = 0; i < n; i++) { showStudent(&arr[i]); } // 找最高分 int maxIndex = 0; for (int i = 1; i < n; i++) { if (arr[i].score > arr[maxIndex].score) { maxIndex = i; } } cout << "\n最高分学生:" << endl; showStudent(&arr[maxIndex]); // 释放动态内存 delete[] arr; arr = nullptr; system("pause"); return 0; }

四、结构体指针做函数参数(高效写法)

// 用指针,避免拷贝,效率更高 void setScore(Student *p, double s) { p->score = s; }

调用:

Student stu = {1001, "张三", 80}; setScore(&stu, 99);

比值传递更快,尤其结构体很大时。


五、新手高频易错点

  1. 指针访问成员用.而不是->
  2. 动态结构体数组用delete释放,应该用delete[]
  3. 指针未初始化就使用(野指针)
  4. 忘记释放动态内存,造成内存泄漏
  5. 循环越界访问结构体数组

六、今日重点总结

  1. 结构体指针访问成员用->,变量用.
  2. 动态结构体数组:Student *arr = new Student[n]
  3. 函数传结构体优先用指针 / 引用,效率更高
  4. 用完动态内存一定delete[]并置空
  5. 可实现简易学生管理 / 商品管理等小项目
http://www.jsqmd.com/news/686794/

相关文章:

  • 2026年甘肃新疆等地带专用锁具的密封粮库门窗厂家推荐,靠谱品牌盘点 - mypinpai
  • 告别手动下载:用Homebrew管理你的Mac版ADB和Android平台工具链
  • 别再傻傻分不清SNR和EbN0了!通信仿真里的横坐标到底该用哪个?(附MATLAB代码避坑)
  • AI越强越值钱的3种反直觉能力,90%的工程师正在丢掉
  • LFM2-VL-1.6B与Proteus联调:嵌入式AI系统仿真案例
  • 5分钟掌握网盘直链下载助手:一键解锁八大平台高速下载通道
  • 铝木门铝材制造企业怎么选购,福建地区哪家值得考虑 - 工业品网
  • SAML单点登录实战:一次配置,搞定Okta和SAP SuccessFactors(SF平台)
  • 2026年选购废旧物资回收服务 昊盛废旧物资回收客户服务体系健全吗 - 工业推荐榜
  • 网络安全应急
  • 深度优化指南:ThinkPad风扇控制工具TPFanCtrl2的完整配置方案
  • JavaScript中对象属性存在的四种检测方法性能评估
  • 输入220V转5V 400mA简易非隔离降压转换芯片_AH8593
  • 从零到一:手把手教你用conda搞定GDAL和rasterio全家桶(Windows/Linux/macOS通用)
  • qmc-decoder:终极QQ音乐格式转换工具,3分钟解锁你的加密音乐收藏
  • Cloudflare漏洞事件解析与HTTPS数据泄露防护
  • Rust 宏展开过程分析与调试
  • Spring Boot 2.4+ 升级后,bootstrap.yml 配置突然失效?别慌,一个依赖搞定(附版本对照表)
  • AI 逆向分析国航 AirChina FECU 参数来源并实现离线生成
  • 网络安全实战nginx漏洞版本升级 1.28.0到1.30.0
  • 别再只会用CSS Transition了!用FLIP动画思想搞定复杂位移与缩放(以扭蛋机为例)
  • 2283 美元!AI 成功写出 Chrome Bug 利用链,未来黑客攻击门槛或持续下降
  • 别再死记硬背二分法了!用C++ STL的lower_bound/upper_bound实战刷题(附LeetCode例题)
  • 企庭实业:AI驱动的企业家多层次服务创新实践 - 资讯焦点
  • 2026年4月济南装修/全包装修/别墅装修/精装房装修/全屋定制公司哪家好 - 2026年企业推荐榜
  • AirPodsDesktop:在Windows和Linux上解锁苹果耳机完整体验的3大秘诀
  • AI将漏洞利用提速至分钟级,补丁窗口期彻底崩溃
  • 地图数据处理终极指南:Mapshaper 让地理信息处理变得简单快速
  • 别再被OpenAI的APIConnectionError卡住了!手把手教你用Python设置代理(附完整代码)
  • 用Git Bisect快速定位引入Bug的提交