不依赖于原始的c++复制数组
C++ Copy Array Without dependency on original
如果我想让新数组不依赖于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
然后,我们有两个数组,其中一个是另一个的副本,但完全独立。
- 在数组中使用C++中的哈希表复制数组中的元素
- 快速复制数组到阵列
- 如何在C 中复制数组
- 赋值运算符复制数组中除可用空间之外的所有内容
- 尝试复制数组时从 DLL 调用函数时程序崩溃
- 反向复制数组
- 复制数组 - 将数组加倍后崩溃
- 复制数组和气泡排序 C++
- 在结构中复制构造函数:是否复制数组
- 如何从类中复制数组并将新数组的大小加倍
- 在C++中复制数组的麻烦
- 逐行复制数组的内容
- tictactoe和复制数组
- 正在使用数组的名称strring复制数组
- c++复制数组到数组
- . net互操作是来回复制数组数据,还是固定数组?
- 从通过函数发送的结构体中复制数组
- 使用CUDA Thrust置换迭代器复制数组的特定元素
- C/ c++中有复制数组的函数吗?
- 在引用中复制数组