你如何在C中移动数组的起始索引?

我试图在C中切换一个int数组的起始索引。准确地说,我有以下数组:

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

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

 {array = &(array[1])} 

但是,这不起作用,我从类型’int *’}中分配类型’int [4]’时出现{不兼容类型’的错误。

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

谁能帮我这个?

你有几个选择:

将所有元素移动一个

如果不需要保存内容:

 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指向数组中的第二个元素,有效地允许您将数组[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 !! 

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

你可以这样做,虽然p指向原始arrayarray不变。

 #include  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复制数组,同样复制这些位。

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

你不能’缩小’或’扩展’即。 在C / C ++中改变以这种方式创建的数组的大小。

您可能会关注的是动态内存分配,您可以使用它来执行此类操作。