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

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ı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:57:01