Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;复制阵列而不依赖于原始阵列 如果我希望新的数组不依赖于C++中的原始数组,那么如何将数组复制到一个新数组中。我知道它与使用指针有关,但我对C++是新的,不太明白这是如何工作的。_C++ - Fatal编程技术网

C++;复制阵列而不依赖于原始阵列 如果我希望新的数组不依赖于C++中的原始数组,那么如何将数组复制到一个新数组中。我知道它与使用指针有关,但我对C++是新的,不太明白这是如何工作的。

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

如果有两个数组,每个数组定义为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 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
的参数是错误的吗?