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,这里用指针的引用,原因确实如你猜测的——涉及数组扩容,需要修改指针本身的指向。
这个函数里的关键操作是:
- 分配更大的新数组内存:
AllAnswers *temp = new AllAnswers[questionsCounter+1]; - 释放旧数组的内存:
deallocateAnswers(oldAnswers); - 让
oldAnswers指向新分配的内存:oldAnswers = new AllAnswers[questionsCounter+1];
如果不用指针引用,传递的只是oldAnswers的副本。此时你修改的是副本的指向(让副本指向新内存),但main里的原指针依然指向已经被释放的旧内存——不仅main里看不到新数组,还会造成内存泄漏。
用了指针引用后,你操作的就是main里的原指针本身,修改它的指向让它绑定到新的内存区域,这样main里的oldAnswers自然就指向扩容后的数组了。
类比一下:你需要“换一个新的房间”,所以必须直接修改原门牌号(原指针的值),而不是修改副本的门牌号。
核心总结
- 当要修改指针指向的内存内容时,传递指针值(副本)就足够,因为副本和原指针共享同一块内存。
- 当要修改指针本身的指向(比如重新分配内存、切换指向的内存区域)时,必须传递指针的引用(或者指针的指针),才能让修改影响到原指针。
内容的提问来源于stack exchange,提问作者Armino
相关产品推荐
相关产品推荐

