C ++:array1 = array2 vs使用循环将array2的值分配给array1

时间:2020-10-20 15:02:33

标签: c++ arrays pointers

我正在寻找可以纠正我对指针和数组的理解的人。

说我有两个数组:

int* array1 = new int[10];
int* array2 = new int[10]{ 1,2,3,4,5,6,7,8,9,10 };

当我执行array1 = array2时,会得到以下地址值:

array1: 0000027964C831D0
array2: 0000027964C831D0
&array1[0]: 0000027964C831D0
&array2[0]: 0000027964C831D0

当我做for (size_t i = 0; i < 10; i++) { array1[i] = array2[i]; }时,我得到:

array1: 0000027964C832B0
array2: 0000027964C83710
&array1[0]: 0000027964C832B0
&array2[0]: 0000027964C83710

第一种情况(非循环)对我来说很有意义。我正在将array2中数组的地址分配给array1,所以现在我有两个指向同一数组(或更具体地说,array2 [0])的指针,因此&array1 [0]和&array2 [0]相同。

但是从第二种情况(循环)开始,指针具有不同的地址。我是说for循环创建了数组的副本吗?虽然这对我来说听起来是错误的。

1 个答案:

答案 0 :(得分:4)

指针是地址。可以将它们视为纸上写有住所地址的纸。

int* array = new int[10];

正在建造一排10栋房屋(new int[10]),然后写下这些房屋的位置并将地址存储在array中。

array是一个数组,这会使您感到困惑。它把房子的地址误认为房子。一张纸上写着123 road street不是我的房子,即使它唯一地命名了我的房子。

把领土的地图弄错真的很容易,并且会导致混乱。您必须做一些工作才能解决这个问题。

array1=array2正在拿一张纸array1,并在其上面写下第二个房屋的地址。它对房屋无能为力。他们仍然在那里-但是您可能不再有它们在哪里的记录。因此,现在它们将被遗弃和丢失(这称为内存泄漏)。

array1[0] = array2[0]拿一张名为array2的纸,走到上面列出的地址,然后看那里的第一所房子(又名0)。然后,它拉出扫描仪并扫描整个房屋。

然后您走到array1点,那里说有一排房子。您去了第一所房子(又名0),然后拿出扫描仪。您将开关从扫描切换到打印,然后将其对准房屋。

它会摧毁那里的房屋,并在array2命名的区块上打印您扫描过的房屋的副本。

然后,您返回到由array2命名的块,扫描array2[1]块上的第二个房子,向后走并在第一块第二个房子的array1[1]上打印。

与在纸上刮下该块的地址并将其替换相比,这是非常不同的操作。

现在,&array1[0]将转到由array1命名的块,然后转到第一个房屋[0],然后读取上面写的地址(&)。当我们用第一所房子的地址来命名时,事实证明这与我们在array1本身中写下的内容相匹配。

array1[1]将有一个不同的地址-&array1[0]-但它将是array1[0]的隔壁地址。

相关问题