结构体指针与动态数组实战指南
一、结构体指针
指向结构体变量的指针,本质还是指针。
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);比值传递更快,尤其结构体很大时。
五、新手高频易错点
- 指针访问成员用
.而不是-> - 动态结构体数组用
delete释放,应该用delete[] - 指针未初始化就使用(野指针)
- 忘记释放动态内存,造成内存泄漏
- 循环越界访问结构体数组
六、今日重点总结
- 结构体指针访问成员用
->,变量用. - 动态结构体数组:
Student *arr = new Student[n] - 函数传结构体优先用指针 / 引用,效率更高
- 用完动态内存一定
delete[]并置空 - 可实现简易学生管理 / 商品管理等小项目
