我正在尝试在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数组是对数组第一个元素的引用。
任何人都可以帮我吗?
答案 0 :(得分:10)
您有几个选择:
将所有元素移动一个
如果不需要保存内容:
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 !!
这里的原因是您无法在此上下文中初始化数组。
答案 1 :(得分:1)
您可以执行此操作,但p
点位于原始array
内。 array
未更改。
#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
复制数组,同样复制这些位。
如上所示,指针允许您在数组中移动。
答案 2 :(得分:0)
你不能'缩小'或'扩展'即。在C / C ++中改变以这种方式创建的数组的大小。
您可能会关注的是动态内存分配,您可以使用它来执行此类操作。