You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++动态数组函数参数疑问:为何一个无需&一个必须用?

为什么两个C++指针操作函数的表现不同?

这个问题问到了C++指针传递的核心点上——我们到底是在修改指针指向的内容,还是在修改指针本身的指向。结合你的代码,咱们一步步拆解清楚:

先看dataEntry函数:修改指针指向的内容,不需要引用

函数参数是Student * allStudents,这里传递的是指针的副本,但这个副本和main里的原指针指向的是同一块内存区域(也就是你在main中创建的动态数组)。

你在函数里做的操作,比如:

cin.getline(allStudents[i]._name, 30);
allStudents[i]._userName = new char[11];

都是直接修改allStudents指针指向的数组元素成员——本质是在操作原数组内存中的数据,而非修改allStudents这个指针本身的值(比如让它指向新的内存地址)。所以函数结束后,main里的原指针依然指向原来的数组,自然能看到修改后的结果。

简单类比:你只是用指针“打开房间门,修改房间里的东西”,没换门牌号,原指针还能找到这个房间,看到里面的变化。

再看addNewAnswer函数:修改指针本身的指向,必须用引用

函数参数是AllAnswers *& oldAnswers,这里用指针的引用,原因确实如你猜测的——涉及数组扩容,需要修改指针本身的指向。

这个函数里的关键操作是:

  1. 分配更大的新数组内存:AllAnswers *temp = new AllAnswers[questionsCounter+1];
  2. 释放旧数组的内存:deallocateAnswers(oldAnswers);
  3. 让oldAnswers指向新分配的内存:oldAnswers = new AllAnswers[questionsCounter+1];

如果不用指针引用,传递的只是oldAnswers的副本。此时你修改的是副本的指向(让副本指向新内存),但main里的原指针依然指向已经被释放的旧内存——不仅main里看不到新数组,还会造成内存泄漏。

用了指针引用后,你操作的就是main里的原指针本身,修改它的指向让它绑定到新的内存区域,这样main里的oldAnswers自然就指向扩容后的数组了。

类比一下:你需要“换一个新的房间”,所以必须直接修改原门牌号(原指针的值),而不是修改副本的门牌号。

核心总结

  • 当要修改指针指向的内存内容时,传递指针值(副本)就足够,因为副本和原指针共享同一块内存。
  • 当要修改指针本身的指向(比如重新分配内存、切换指向的内存区域)时,必须传递指针的引用(或者指针的指针),才能让修改影响到原指针。

内容的提问来源于stack exchange,提问作者Armino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:03:56