为什么我不能通过在 cpp 中使用新运算符传递指针来更改值?

Why I can't change a value via passing pointer using new-operator in cpp?

本文关键字:指针 运算符 不能 cpp 为什么      更新时间:2023-10-16

我想通过传递方法来更改变量。我使用传统的C方式。我在Visual Studio 2010中使用Visual 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; // for terminating
    fprintf(stdout, "exampleMethod(): myArray is:%s.n", array);
}
void main() {
    char* myArray = 0;
    exampleMethod(myArray);
    fprintf(stdout,"main(): myArray is:%s.n", myArray);
    getchar(); // to hold the console.
}

此代码的输出为:

exampleMethod(): myArray is:hello.
main(): myArray is:(null).

我不明白为什么指针值在main()中没有更改.我知道它是通过引用传递的,我用指针更改了 myArray 的值。我还使用 new-运算符来初始化该指针。

之后,我更改了代码,使用 new-运算符在 main 方法中初始化了变量myArray。(在它进入exampleMethod()之前。

void exampleMethod(char *array) {
    array[0] = 'h';
    array[1] = 'e';
    array[2] = 'l';
    array[3] = 'l';
    array[4] = 'o';
    array[5] = 0; // for terminating
    fprintf(stdout, "exampleMethod(): myArray is:%s.n", array);
}
void main() {
    char* myArray = new char[6];;
    exampleMethod(myArray);
    fprintf(stdout,"main(): myArray is:%s.n", myArray);
}

令人惊讶的是,代码运行正常。它给出了这个输出:

exampleMethod(): myArray is:hello.
main(): myArray is:hello.

为什么以前的代码没有以我预期的方式运行?我用Visual Studio 2010编译并运行它,这是Visual C++项目。我也在Visual Studio 2015中尝试过。

您正在通过 void exampleMethod(char *array) 传递指针的副本,因此对 exampleMethod() 中的指针的任何更改都不会影响 main() 中的指针。

您可能希望通过引用传递它(在标识符之前添加与号 & 以使其成为引用(:

void exampleMethod(char * &array)

因此,通过这种方式,对 exampleMethod 中的指针的任何修改都将应用于 main() 中的指针,因为它们现在是同一个对象。

还有一个旁注:每当从动态分配中获取数组时

,不要忘记delete[]数组。