不依赖于原始的c++复制数组

C++ Copy Array Without dependency on original

本文关键字:c++ 复制数组 原始 依赖于      更新时间:2023-10-16

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

简短回答

如果您有两个定义为每个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

长回答

如果你执行一个数组的拷贝,如果我正确理解了你所说的"依赖"的意思,那么拷贝后的新数组将不依赖于原来的数组。

如果你从记忆的角度来思考,而不是从语言的角度来思考,那就更清楚了。数组是存储在内存中的一系列值。让我们考虑这段代码:

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

然后,我们有两个数组,其中一个是另一个的副本,但完全独立。