为什么我不能通过在 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 的值。我还使用 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[]
数组。
相关文章:
- C++ 带有函数指针的运算符优先级
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 在一个指令中声明更多指针的运算符优先级
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- c++:复制、删除和运算符=在原始指针映射中
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 类重载运算符 '<' 插入指向该对象集的共享指针时不调用
- 使用继承的指针列表复制构造函数或重载运算符=
- 是否可以将引用类型别名与指针运算符一起使用来声明对指针的引用?
- Caffe 源代码中层函数标头中指针运算符的含义
- 嵌套智能指针运算符>
- 运算符和指针运算符的地址
- 对于什么对象指针值,指向成员的指针运算符调用未定义的行为
- 在 65536 位置访问迭代器的指针运算符会导致段错误
- 检测对堆栈变量的调用delete(使用强制转换到指针运算符)
- C++中指向成员的指针运算符 ->* 和 .* 是什么?
- 关于智能指针运算符*和运算符>重载的说明