C++;复制阵列而不依赖于原始阵列 如果我希望新的数组不依赖于C++中的原始数组,那么如何将数组复制到一个新数组中。我知道它与使用指针有关,但我对C++是新的,不太明白这是如何工作的。
如果有两个数组,每个数组定义为10字节,比如说C++;复制阵列而不依赖于原始阵列 如果我希望新的数组不依赖于C++中的原始数组,那么如何将数组复制到一个新数组中。我知道它与使用指针有关,但我对C++是新的,不太明白这是如何工作的。,c++,C++,如果有两个数组,每个数组定义为10字节,比如说unsigned char arrayOne[10],arrayTwo[10],它们已经是独立的,可以通过以下方式轻松地将一个复制到另一个: for(unsigned i=0; i < 10; i++) arrayTwo[i] = arrayOne[i]; 您还可以使用std::copy: memcpy(arrayTwo, arrayOne, 10); // 10 bytes copied from arrayOne to arr
unsigned char arrayOne[10],arrayTwo[10]代码>,它们已经是独立的,可以通过以下方式轻松地将一个复制到另一个:
for(unsigned i=0; i < 10; i++)
arrayTwo[i] = arrayOne[i];
您还可以使用std::copy
:
memcpy(arrayTwo, arrayOne, 10); // 10 bytes copied from arrayOne to arrayTwo
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位内存):
在此上下文中,存储了10个字节,还有一个名为myArray
的2字节变量,它在内存中也占用了2个字节,如下所示:
myArray myArray values
--------------- ----------------------
Location |0x0333|0x0334| .... |0x1234|0x1235|0x1236| .....
---------------------------------------------------
Content | 0x12 | 0x34 | .... | 12 | 14 | 16 | .....
---------------------------------------------------
myArray[2] = 99;
然后,当你这样做的时候:
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];
假设otherArray=0x4455
,这将与以下内容相同:
*(0x4455 + 2) = 99;
让我们想象一下这在我们想象的16位内存中的结果:
Location |0x1234|0x1235|0x1236| ....
---------------------------------------------------
Content | 12 | 14 | 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
然后,我们有两个阵列,其中一个是另一个的副本,但完全独立。一个不依赖于原始阵列的副本?你的意思是像一台没有碳粉的复印机?可能的重复使用请包括你尝试了什么,哪里出了问题,以及你想要它做什么。这是一种更好的沟通您不了解的内容的方法。只需使用std::vector
而不是原始数组。然后你可以通过赋值或构造来复制;该评论可能会向新手建议使用memcpy
有一些好处,但实际上应该避免使用该函数。因为参数很容易出错(事实上你也这么做了!),所以最好使用循环或std::copy
。我同意你的看法,因为该评论可能不适合新手,可能会导致混淆。我会修改它。但是,您确定memcpy
的参数是错误的吗?