首先,如果之前有人问过,我道歉。我似乎无法找到正确的信息。
以下代码不打印“300”,因为我认为:
#include <iostream>
int main()
{
int *array;
int *arrayCopy = array;
array = new int[4];
array[0] = 100;
array[1] = 200;
array[2] = 300;
array[3] = 400;
std::cout << arrayCopy[2];
return 0;
}
然而,如果我移动线
,它确实如此int *arrayCopy = array;
在上面代码中它后面的行下方。那是为什么?
(PS:我知道有内存泄漏,std :: vector更好......我只是好奇)。
答案 0 :(得分:5)
不,当你执行int *arrayCopy = array;
时,你会在那个时刻将array
的价值捕获到arrayCopy
,所以如果你修改了(注意最初array
指向某个随机位置,您在复制到{{1} 之后new
array
,指向正确的位置然后那些改变的东西不会反映回arrayCopy
。
答案 1 :(得分:4)
也许您正在考虑使用对指针的引用?以下是您当前代码所发生的情况:
int *array; // Currently points to an undefined (invalid) memory location.
int *arrayCopy = array; // Now this points to the same undefined memory location as array.
array = new int[4]; // Now array points to valid memory, but arrayCopy still points to undefined space.
如果你做了类似的事情,那就不一样了:
int *array; // Points to undefined
int *&arrayCopy = array; // This is a reference to array. That means if you change array, arrayCopy will also reflect the changes.
array = new int[4]; // Now since array points to valid space, arrayCopy does too.
从技术上讲,这并不完全正确,因为正在发生不同的事情。引用本质上与指针的间接级别相同,除了编译器为您执行所有解除引用。但我所描述的基本上是它的工作原理。如果您只是将额外的&
添加到那里,那么您的代码将按照您的想法进行操作。
答案 2 :(得分:3)
int *array; // array is ???
int *arrayCopy = array; // copy is ???
array = new int[4]; // array is valid pointer, copy still ???
此代码段执行以下操作:
int
指针(可以是任何内容)。换句话说,第三行“断开”两个指针,使副本仍然指向一个不确定的位置。
取消引用该指针副本是未定义的行为,而不是您想要解决的问题。
相反,如果序列更改为(如您的问题中所述):
int *array; // array is ???
array = new int[4]; // array is valid pointer
int *arrayCopy = array; // copy is now also the valid pointer
然后在初始化原始指向数组后,将复制指针设置为原始。不会发生断开连接,因此array[2]
实际上与arrayCopy[2]
相同。
答案 3 :(得分:1)
是否可以在内存分配之前复制动态分配的数组指针?
没有
但是,你可以这样做:
int *array;
int *&arrayReference = array;
答案 4 :(得分:0)
int *array; // points to some random value
int *arrayCopy = array; // points to the same value
array = new int[4]; // array points to a new value, arrayCopy does not
如果你想制作一个指向任何“数组”指向的指针,请创建一个双指针