如果我希望新数组不依赖于C ++中的原始数组,我将如何将数组复制到新数组。我知道它与使用指针有关,但我是C ++的新手,并不太明白这是如何工作的
答案 0 :(得分:1)
如果您有2个数组,每个数组定义为10个字节,比如unsigned char arrayOne[10], arrayTwo[10];
,它们已经是独立的,并且可以通过这种方式轻松地将其中一个复制到另一个:
for(unsigned i=0; i < 10; i++)
arrayTwo[i] = arrayOne[i];
你也可以使用memcpy
:
memcpy(arrayTwo, arrayOne, 10); // 10 bytes copied from arrayOne to arrayTwo
您还可以使用std::copy
:
std::copy(arrayOne, arrayOne+10, arrayTwo); // Copy 10 elements from arrayOne to ArrayTwo
如果你执行一个数组的副本,如果我正确地理解了你的意思,那么新数组在副本之后就不会对原文有任何依赖关系&#34;依赖&#34;。
如果从内存的角度考虑它,而不是从语言的角度来看,则更清楚。数组是存储在一起的值序列。让我们考虑一下这段代码:
unsigned char myArray[10] { 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 };
编译和执行后,这10个字节一起存储在内存中的给定位置。想象一下该位置为0x1234(为简单起见,请考虑我们的计算机具有16位内存):
Location |0x1234|0x1235|0x1236| ....
---------------------------------------------------
Content | 12 | 14 | 16 | .....
---------------------------------------------------
在这种情况下,你有10个字节存储,还有一个名为myArray
的2字节变量,它在内存中占用2个字节,如下所示:
myArray myArray values
--------------- ----------------------
Location |0x0333|0x0334| .... |0x1234|0x1235|0x1236| .....
---------------------------------------------------
Content | 0x12 | 0x34 | .... | 12 | 14 | 16 | .....
---------------------------------------------------
然后,当你做这样的事情时:
myArray[2] = 99;
你实际上是这样做的:
*(myArray + 2) = 99;
反过来意味着:
*(0x1234 + 2) = 99;
这是指针的工作方式。 myArray是一个指针:一个变量,用于保存数组启动的地址。知道数组的所有元素都是连续的,每个元素占用1个字节,访问元素8就是访问数组的开头加8,即*(myArray + 8)
或myArray[8]
。
因此,如果你想创建一个独立的数组副本,你需要另外10个字节位于内存中的不同位置,另一个指向这些新10个字节的开头:即另一个数组。这段代码就是这样做的:
unsigned char myArray[10] { 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 };
unsigned char otherArray[10];
for(unsigned i=0; i < 10; i++)
otherArray[i] = myArray[i];
这创建了两个具有相同内容的独立数组:两个10字节的空格,它们的两个指针指向它们在内存中的位置。让我们对第二个数组进行操作:
otherArray[2] = 99;
想象otherArray = 0x4455
,这将与:
*(0x4455 + 2) = 99;
让我们在想象中的16位内存中想象一下这个结果:
myArray myArray values
--------------- ----------------------
Location |0x0333|0x0334| .... |0x1234|0x1235|0x1236| .....
---------------------------------------------------
Content | 0x12 | 0x34 | .... | 12 | 14 | 16 | .....
---------------------------------------------------
^^^^^^
Original left untouched
otherArray otherArray values
--------------- ----------------------
Location |0x0422|0x0423| .... |0x4455|0x4456|0x4457| .....
---------------------------------------------------
Content | 0x44 | 0x55 | .... | 12 | 14 | 99 | .....
---------------------------------------------------
^^^^^
Changed value
然后,我们有2个数组,其中一个是另一个的副本,但完全独立。