到目前为止,我正在处理第0个位置的数组,但是我需要将它从0更改为1,这样如果之前它从0开始到n-1那么现在它应该从1开始到n。有没有办法解决这个问题?
答案 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个索引,不幸的是他并不知道。