【发布时间】:2018-06-09 20:46:22
【问题描述】:
这已经困扰我一个多星期了。我可能错过了解释这一点的帖子,但我已经阅读了一堆帖子/文章,它们要么没有告诉我任何我不知道的事情,要么超出了我的想象。
考虑一下:
#include<iostream>
using namespace std;
void poo(int *currArray){
cout << "*currArray: " << currArray << endl;
int * blah = new int [5];
cout << "blah: " << blah << endl;
currArray = blah;
cout << "currArray after switch " << currArray << endl;
}
int main(){
int * foo = new int [5];
cout << "foo: " << foo << endl;
poo(foo);
cout << "foo after poo " << foo << endl;
}
产生输出:
foo: 0x7ffdd5818f20
*currArray: 0x7ffdd5818f20
blah: 0x7ffdd5818ef0
currArray after switch 0x7ffdd5818ef0
foo after poo 0x7ffdd5818f20
如您所见,虽然地址切换发生在函数内部,但它不会延续到主函数。我也知道这是内存泄漏,但我认为这与问题无关。
我的理解是数组本质上指向它的第一个元素的地址。我也理解数组是“通过引用”传递的。即,传递数组的地址。
那么为什么poo之后地址切换不持续呢?我是不是把currArray的指针(foo的别名)改成了blah的指针?
【问题讨论】:
-
好吧,顺便说一句,如果你打算做的工作,你会有一个指向本地对象的指针,当你尝试
cout它时,它会超出范围,所以这不是好的。一般不要让参数或返回值指向生命周期受限于本地范围的本地对象。 -
哦,我明白你在说什么。但是即使我使用
new在堆上分配foo和blah,我仍然有同样的问题。我应该编辑我的问题以包含它吗? -
new和delete在现代 C++ 中通常应该避免使用,但是是的,包含这将是一件好事。我很快就会发布答案。 -
数组可能
feel像传递引用但指针不是。指针是整数类型。这意味着它只是一个保存地址的整数。当您调用该方法时,该整数(指针)的副本将传递给该函数。在 C 和 C++ 中,数组总是作为指针传递。 -
@DillonChan 当您执行此操作时,您将
currArrays 指针的副本传递给函数void poo(int *currArray)(请记住,按值传递)。为了在currArray中进行任何更改,您需要引用void poo(int* &currArray)或指针地址void poo(int** currArray)。
标签: c++ pointers scope reference