C ++复制数组不依赖于原始数据

时间:2015-05-30 11:48:31

标签: c++

如果我希望新数组不依赖于C ++中的原始数组,我将如何将数组复制到新数组。我知道它与使用指针有关,但我是C ++的新手,并不太明白这是如何工作的

1 个答案:

答案 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个数组,其中一个是另一个的副本,但完全独立。