C++中为何通过new操作符传递指针无法修改主函数变量值?
为什么第一段代码无法修改主函数中的指针?
这是个新手刚接触C/C++指针时非常容易踩的坑,咱们把问题拆解开来说清楚:
核心问题:指针的“传值” vs “传引用/指针的指针”
在C++里,普通的指针参数传递依然是「传值拷贝」——你把主函数里的myArray(初始值是0,也就是空指针)传给exampleMethod的array参数时,其实是把myArray的值复制了一份,放到函数内部的局部变量array里。这俩变量现在只是值相同,但完全是独立的两个变量。
看第一段代码里的关键操作:
void exampleMethod(char *array) { array = new char[6]; // 这里修改的是函数内部的局部指针! // ...赋值操作 }
你在函数里给array赋值new char[6],只是改变了函数内部那个array变量的指向,和主函数里的myArray没有任何关系。等函数执行完毕,局部的array被销毁,主函数的myArray还是原来的空指针,而且这里还会造成内存泄漏——new出来的字符数组没有被释放,也没人能找到它的地址了。
为什么第二段代码能正常工作?
第二段代码里,主函数先通过new char[6]给myArray分配了一块内存,然后把这个指针传给函数。这时候函数里的array依然是myArray的拷贝,但它们指向同一块内存地址。你修改array[0]到array[5]的内容,本质是在修改这块共享内存里的数据,主函数的myArray指向的也是这块内存,所以自然能看到修改后的结果。
如何修改第一段代码达到预期效果?
如果你想在函数里修改主函数中指针变量本身的指向,有两种常用方式:
方式1:使用C++的指针引用(推荐)
把函数参数改成指针的引用,这样函数里操作的就是主函数的指针本身:
#include<cstdio> using namespace std; void exampleMethod(char* &array) { // 这里用引用符号& array = new char[6]; array[0] = 'h'; array[1] = 'e'; array[2] = 'l'; array[3] = 'l'; array[4] = 'o'; array[5] = 0; fprintf(stdout, "exampleMethod(): myArray is:%s.\n", array); } int main() { // 注意:标准C++里main应该返回int char* myArray = 0; exampleMethod(myArray); fprintf(stdout,"main(): myArray is:%s.\n", myArray); delete[] myArray; // 记得释放内存,避免泄漏 getchar(); return 0; }
方式2:使用C风格的指针的指针
如果你想保持纯C的写法,可以传指针的指针,通过解引用来修改外部指针:
#include<cstdio> void exampleMethod(char **array) { *array = new char[6]; (*array)[0] = 'h'; (*array)[1] = 'e'; (*array)[2] = 'l'; (*array)[3] = 'l'; (*array)[4] = 'o'; (*array)[5] = 0; fprintf(stdout, "exampleMethod(): myArray is:%s.\n", *array); } int main() { char* myArray = 0; exampleMethod(&myArray); // 传指针的地址 fprintf(stdout,"main(): myArray is:%s.\n", myArray); delete[] myArray; getchar(); return 0; }
总结一下关键点
- 传普通指针是传值,修改指针变量本身不会影响外部的指针;
- 要修改外部指针的指向,必须传指针的引用或者指针的指针;
- 如果只是修改指针指向的内存内容,传普通指针就足够,因为它们共享同一块内存地址。
内容的提问来源于stack exchange,提问作者Halil Oymacı
相关产品推荐
相关产品推荐

