在C语言中如何改变数组的起始索引?

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数组是数组第一个元素的引用。
有人能帮我吗?

这种印象是一个误解,仍然被错误地认为是“更直观”的,因此仍然被教授。 它经常在早期或晚期咬人的屁股。 - StoryTeller - Unslander Monica
数组名称是一个常量,它描述了为该数组分配的整个内存块。它永远不能被赋值。当作为值使用时,它会自动转换为指向第一个元素的指针,通过它可以访问和修改数组元素。 - Dale Hagglund
@DaleHagglund:数组名是数组类型的表达式。在某些情况下,它可以被隐式转换为指针值。在C语言中,数组类型的表达式不仅仅是数组名,都不能被赋值。 - newacct
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]

使用指针将array[1]作为array[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 !!

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


需要注意的一点是,给定“int array [4]”,你可以使用sizeof来获取数组的大小,因此也就是元素的数量(sizeof array / sizeof array [0])。大多数这些解决方案(它们都是完全有效的)并不提供可以有效应用“sizeof”的内容。 - Keith Thompson

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移动数组,但它会移动所有位。 可以使用memcpy复制数组,同样会复制所有位。

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


0

在C/C++中,您无法“缩小”或“扩展”即更改以此方式创建的数组的大小。

您可以尝试动态内存分配,通过它您可以实现这样的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接