改变数组的索引

时间:2010-08-16 06:22:50

标签: c

到目前为止,我正在处理第0个位置的数组,但是我需要将它从0更改为1,这样如果之前它从0开始到n-1那么现在它应该从1开始到n。有没有办法解决这个问题?

5 个答案:

答案 0 :(得分:6)

C数组从零开始,总是如此。我强烈建议坚持这一惯例。如果确实需要将第一个元素视为索引1而不是0,则可以在为您进行翻译的函数中包含对该数组的访问。

你为什么需要这样做?你想解决什么问题?

答案 1 :(得分:5)

数组索引从C开始为零;你不能改变它。

如果您有特定的要求/设计方案,在一个方法中启动索引是有意义的,则声明数组的长度为n + 1,并且不要使用第零个位置。

答案 2 :(得分:3)

每次访问数组时从索引中减1,以实现“假的基于1的”索引。

如果你想在程序运行时更改编号,那么你需要的不仅仅是常规数组。如果事物只移动一个位置,则分配(n + 1)个槽并使用指针进入数组。

enum { array_size = 1000 };

int padded_array[ array_size + 1 ];
int *shiftable_array = padded_array; /* define pointer */

shiftable_array[3] = 5; /* pointer can be used as array */
some_function( shiftable_array );

/* now we want to renumber so element 1 is the new element 0 */
++ shiftable_array; /* accomplished by altering the pointer */

some_function( shiftable_array ); /* function uses new numbering */

如果无限期地重复逐个操作,您可能需要实现circular buffer

答案 3 :(得分:1)

你不能。

实际上你可以,但你必须稍微调整一下。定义一个数组,然后在第一个元素之前使用指针。然后,您可以使用此指针中的索引1到n。

int array[12];
int *array_starts_at_one = &array[-1]; // Don't use index 0 on this one
array_starts_at_one[1] = 1;
array_starts_at_one[12] = 12;

但我会建议反对这样做。

答案 4 :(得分:0)

可以找到更多为什么数组为零的参数here。事实上,它是C编程语言非常重要和优秀的特性之一。但是,您可以实现一个数组并从1开始索引,但这将需要花费很多精力才能跟踪。

假设您声明一个整数数组

int a[10];
for(i=1;i<10;i++)
a[i]=i*i;

您需要访问索引为1的所有数组。当然,您需要使用大小(REQUIRED_SIZE_NORMALLY+1)进行声明。 您还应该注意,您仍然可以访问a[0]元素,但是您必须从头脑和代码中忽略它以实现您想要的目标。

另一个问题是阅读代码的人。他会疯狂地试图弄清楚为什么编号从1开始并且是用于某些隐藏目的的第0个索引,不幸的是他并不知道。