结构体指针与动态数组实战指南
2026/4/23 10:42:21 网站建设 项目流程

一、结构体指针

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

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. 可实现简易学生管理 / 商品管理等小项目

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询