Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中移动数组的起始索引?_C_Arrays_Pointers - Fatal编程技术网

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

如何在C中移动数组的起始索引?,c,arrays,pointers,C,Arrays,Pointers,我试图切换C中整数数组的起始索引。准确地说,我有以下数组: { 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};}
我希望将{array}更改为包含{2,3,4}的3个项目的数组。我想知道是否有一种简单的方法可以使用指针而不移动数组中的所有元素。如果{array}仍然是4个项目的数组,只要前3个项目是{2,3,4},我也很高兴。我尝试了以下方法:

{array = &(array[1])}
但是,这不起作用,我得到一个错误,从类型“int*”指定给类型“int[4]”时,显示为{不兼容的类型

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


有人能帮我吗?

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


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

您可以这样做,
p
指向原始
数组中的
点<代码>数组
不变

#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;
}
#包括
内部主(空){
int数组[4]={1,2,3,4};
int*p=array+1;
printf(“%d%d%d\n”,p[0],p[1],p[2]);
返回0;
}
打印“2 3 4”

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


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

您有几个选项:

将所有元素左移一个

如果不需要保存内容物:

int array[4] = { 1, 2, 3, 4 };
然后将元素从索引位置n复制/移动到索引位置n-1:

例如:

int i;
for (i = 1; i < n; ++i)
  array[i-1] = array[i];
它的作用与上面的循环相同

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

如果需要保留原始数据,则可以创建另一个数组并将元素复制到该数组中,而忽略第一个元素

比如说,

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]
现在pArray指向数组中的第二个元素,有效地将数组[1]索引为pArray[0]

使用整数指针数组

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];
原因是
array1
是一个
不可修改的l值
。本质上是一个常数

你也不能这样做

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

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

这种印象是一种误解,它仍然被错误地认为是“更直观的”,因此仍然被教授。数组名是一个常量,用于描述为该数组分配的整个内存块。它永远不会被分配给任何人。当用作值时,它会自动转换为指向第一个元素的指针,通过该指针可以访问和修改数组元素。@DaleHagglund:数组名称是数组类型的表达式。在某些上下文中,它可以隐式转换为指针值。数组类型的表达式在C中是不可赋值的,不仅仅是数组名。需要注意的是,给定
int-array[4]
,您可以使用
sizeof
获得数组的大小,从而获得元素的数量(
sizeof-array/sizeof-array[0]
)。这些解决方案中的大多数(都是非常有效的)都不能给您提供有意义地应用
sizeof
的东西。
int array1[4] = { 1, 2, 3, 4 };
array1 = &array1[1]; // !! Compiler Error !!
int array1[4] = { 1, 2, 3, 4 };
int array2[4] = array[1] // !! Compiler error !!