0

希望我的问题是明确的和相关的,新的指针...... - 我可以一次复制整个数组的一部分,通过引用指向我想要开始复制的数组中第一个插槽的位置的指针吗?

例如 - 给定一个数组:A [ 1,2,3,4,5,7,8,3,2,5,1,0,9] - 我只想从 n' 复制数组的一部分第一个插槽,进入数组 B [0 0 0 .....] 的开头(B 与 A 的长度相同)。

我可以立即使用指针而不是循环吗?类似于 - 将指向 B 中第一个插槽的指针切换到 A 的第 n 个插槽,将 B 中的第 n 个插槽与 A 中的最后一个插槽切换?

非常感谢提前!

4

2 回答 2

6

memcpy就是为了。

memcpy(B, A + n, (N - n) * sizeof(A[0]));

其中N是 中的元素个数A。如果A真的是一个数组(不仅仅是指向一个的指针),那么N可以计算sizeof(A) / sizeof(A[0]),因此调用简化为

memcpy(B, A + n, sizeof(A) - n * sizeof(A[0]));

memcpy住在<string.h>; 它的第一个参数是副本的目标,第二个参数是源。

(对不起,我并没有真正遵循您想到的指针技巧,所以我无法对此发表评论。)

于 2012-10-28T12:47:20.640 回答
0

我想我明白你在问什么。您可以使用指针来设置您的第二个数组,但这样做的问题是:

int [] primary = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int * secondary = primary + 5;

此时primary是{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},secondary是{6, 7, 8, 9, 0},但问题是它们都指向到内存中的同一个数组。因此,如果您编辑“次要”的任何元素,而不是拥有两个独立的副本,它们也会在“主要”中进行编辑。

secondary[2] = 10;
for(int i = 0; i < 10; ++i)
  cout << primary[i] << ' ';

这部分代码现在将产生: 1 2 3 4 5 6 7 10 9 0

正确的方法是要么设置新数组,然后循环复制值,要么使用memcpy()。

编辑:

//Rotate an array such that the index value is moved to the front of the array
null rotateArray( &int original[], int size, int index)
{
  int * secondary = new int[size]; //dynamically allocated array
  for(int i = 0; i < size; ++i)
  {
    secondary[i] = original[(i+index)%size];
  }
  original = secondary; //Move the original array's pointer to the new memory location
}

一些注意事项:

secondary[i] = original[(i+index)%size];

这就是我旋转阵列的方式。假设您有一个大小为 5 的原始数组,并且您希望第四个元素成为新的开始(请记住,元素编号为 0-(size-1)):

我 = 0;

次要[0] = 原始[(0 + 3)%5]// = 原始[3]

我 = 1;

次要[1] = 原始[(1 + 3)%5]// = 原始[4]

我 = 2;

次要[2] = 原始[(2 + 3)%5]// = 原始[0]

...

代码的最后一部分:

original = secondary;

有点可疑,因为我不记得一旦函数退出,c++ 是否会尝试清理使用的内存。一种更安全且 100% 确定的方法是循环遍历辅助数组的元素并将其复制到原始数组中:

for(int i = 0; i < size; ++i)
  original[i] = secondary[i];
于 2012-10-28T13:05:41.103 回答