4

我正在尝试在 C 中切换整数数组的起始索引。确切地说,我有以下数组:

{ int array[4] = {1,2,3,4};}

我希望将 {array} 更改为包含 {2,3,4} 的 3 个项目的数组。我想知道是否有一种简单的方法可以使用指针而不移动数组中的所有元素。只要前 3 个项目是 {2,3,4},如果 {array} 仍然是 4 个项目的数组,我也很高兴。我尝试了以下方法:

{array = &(array[1])}

但是,这不起作用,并且我收到一条错误消息,提示{从类型“int *”分配给类型“int [4]”时不兼容类型}。

我的印象是 C 数组是对数组第一个元素的引用。

谁能帮我这个?

4

3 回答 3

12

你有几个选择:

将所有元素左移一位

如果不需要保存内容:

int array[4] = { 1, 2, 3, 4 };

然后将元素从索引位置 n 复制/移动到索引位置 n-1:

例如:

int i;
for (i = 1; i < n; ++i)
  array[i-1] = array[i];

您还可以查看memmove哪个可能更有效。

例如,

memmove(array, array+1, sizeof array - sizeof *array);

它与上面的循环做同样的事情。

将元素复制到一个新数组中,忽略第一个

如果需要保留原始数据,那么您可以创建另一个数组并将元素复制到忽略第一个元素的数组中。

例如,

int array1[4] = { 1, 2, 3, 4 };
int array2[3];
int i;

for (i = 0, i < SIZE_OF_SMALLER_ARRAY; ++i)
  array2[i] = array1[i+1]

使用指针将数组 [1] 引用为数组 [0]

如果您想使用指针消除移动/复制数据的需要:

int array[4] = { 1, 2, 3, 4 };
int *pArray = &array[1];

现在 pArray 指向数组中的第二个元素,有效地允许您将 array[1] 索引为 pArray[0]

使用 int 指针数组

int array[4] = { 1, 2, 3, 4 };
int *parray[3];

int i;
for (i = 0; i < SIZE_OF_SMALLER_ARRAY; ++i)
  parray[i] = &array[i+1];

注意事项

你不能做的一件事是...

int array1[4] = { 1, 2, 3, 4 };
array1 = &array1[1]; // !! Compiler Error !!

原因array1是一个non-modifiable l-value。本质上是一个常数。

你也不能这样做...

int array1[4] = { 1, 2, 3, 4 };
int array2[4] = array[1] // !! Compiler error !!

这里的原因是您无法在此上下文中初始化数组。

于 2013-10-31T16:06:08.257 回答
1

你可以做到这一点,但p在原件内点arrayarray不变。

#include <stdio.h>

int main(void) {
        int array[4] = {1,2,3,4};
        int *p = array + 1;
        printf("%d %d %d\n", p[0], p[1], p[2]);
        return 0;
}

打印“2 3 4”

您可以使用 移动数组memmove,但它确实会移动所有位。可以使用 复制数组memcopy,再次复制位。

如上所示,指针允许您在数组内移动。

于 2013-10-31T16:04:25.637 回答
0

你不能“缩小”或“扩大”,即。更改在 C/C++ 中以这种方式创建的数组的大小。

您可能会研究的是动态内存分配,您可以使用它来做类似的事情。

于 2013-10-31T16:03:27.473 回答