我想通过传递方法更改变量。我用传统的C方式。我使用Visual C ++在Visual Studio 2010中编写了此代码。但是它没有给出预期的结果。
代码是一个目的,但我改变它是为了易于理解。
#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-operator初始化该指针。
之后,我更改了代码,我使用new-operator在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。
答案 0 :(得分:2)
您正在通过void exampleMethod(char *array)
传递指针的副本,因此对exampleMethod()
中指针的任何更改都不会影响main()
中的指针。
您可能希望通过引用传递它(在标识符之前添加&符号&
以使其成为引用):
void exampleMethod(char * &array)
因此,这样对exampleMethod
中指针的任何修改都将适用于main()
中的指针,因为它们现在是同一个对象。
并注意:每当从动态分配中获取数组时,不要忘记delete[]
数组。