为什么我不能通过在 cpp 中使用新运算符传递指针来更改值?
Why I can't change a value via passing pointer using new-operator in cpp?
我想通过传递方法来更改变量。我使用传统的 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 的值。我还使用新运算符来初始化该指针。
之后,我更改了代码,我在 main 方法中用 new-operator 初始化了变量 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);
}
令人惊讶的是,代码 运行ning 正确。它给出了这个输出:
exampleMethod(): myArray is:hello.
main(): myArray is:hello.
为什么以前的代码 运行 没有按照我预期的方式进行?我用 Visual C++ 项目 Visual Studio 2010 编译并 运行 它。我也用 Visual Studio 2015 试过了。
您正在通过 void exampleMethod(char *array)
传递指针的副本,因此对 exampleMethod()
中指针的任何更改都不会影响 main()
中的指针。
您可能希望通过引用传递它(在标识符前添加一个符号 &
使其成为引用):
void exampleMethod(char * &array)
因此,通过这种方式,对 exampleMethod
中指针的任何修改也将应用于 main()
中的指针,因为它们现在是同一个对象。
附带说明:无论何时从动态分配中获取数组,都不要忘记 delete[]
数组。
我想通过传递方法来更改变量。我使用传统的 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 的值。我还使用新运算符来初始化该指针。
之后,我更改了代码,我在 main 方法中用 new-operator 初始化了变量 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);
}
令人惊讶的是,代码 运行ning 正确。它给出了这个输出:
exampleMethod(): myArray is:hello.
main(): myArray is:hello.
为什么以前的代码 运行 没有按照我预期的方式进行?我用 Visual C++ 项目 Visual Studio 2010 编译并 运行 它。我也用 Visual Studio 2015 试过了。
您正在通过 void exampleMethod(char *array)
传递指针的副本,因此对 exampleMethod()
中指针的任何更改都不会影响 main()
中的指针。
您可能希望通过引用传递它(在标识符前添加一个符号 &
使其成为引用):
void exampleMethod(char * &array)
因此,通过这种方式,对 exampleMethod
中指针的任何修改也将应用于 main()
中的指针,因为它们现在是同一个对象。
附带说明:无论何时从动态分配中获取数组,都不要忘记 delete[]
数组。