改变阵列
每次访问数组时都会从索引中减去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。
C数组是基于零的,并且总会是。我强烈建议坚持这一惯例。如果确实是需要将第一个元素视为索引1而不是0,则可以将对该数组的访问包装到为您进行翻译的函数中。
为什么你需要这样做?你想解决什么问题?
出于好奇。反正,在功能的帮助下如何做到这一点? 我想知道,如果你能提供任何帮助。 – suvirai 2010-08-16 06:29:37
如果您对数组索引真的很好奇,您可以查看FORTRAN,它可以让您更改索引范围。然后可以使用索引-5至5(包括0)将数组MYARRAY编入索引。 – linuxuser27 2010-08-16 06:33:57
Didier在下面的建议很聪明,否则你可以这样做:'int GetElement(int xs [],int index){return xs [index - 1]; }'然后使用'GetElement(xs,1);'访问第一个元素'' – 2010-08-16 06:34:33
数组索引在C中从零开始;你不能改变这一点。
如果你已经具体要求/设计的方案是有道理的一个开始索引,声明数组是长度为n + 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;
但我会建议对这样做。
我认为这会导致未定义的行为。 – GManNickG 2010-08-16 06:35:04
是的,通过C99§6.5.6/ 8,你不允许通过添加到数组内部的地址来在阵列外形成一个地址(除了结尾之外的地址)。 – Potatoswatter 2010-08-16 07:56:13
为什么数组为零的一些更多的参数可以找到here。事实上,它是C编程语言非常重要和优秀的特性之一。但是,您可以实现一个数组并从1开始索引,但这确实需要花费很多精力来跟踪。
说你声明一个整数数组
int a[10];
for(i=1;i<10;i++)
a[i]=i*i;
你需要访问所有阵列,该指数1 Ofcourse你需要的大小(REQUIRED_SIZE_NORMALLY+1)
申报。 您还应该在这里注意到,您仍然可以访问a[0]
元素,但您必须从头脑和代码中忽略它以实现您想要的效果。
另一个问题是读取你的代码的人。他会坚持试图弄清楚为什么编号从1开始,并且是第0个索引,用于某些隐藏目的,遗憾的是他并不知道。
您是否试图将数组中的所有元素向前移动一次,例如:{1,2,3} => {_,1,2,3}' 或者您是否可以更改索引在C中从1开始而不是0开始? – linuxuser27 2010-08-16 06:27:45
从1开始而不是0 – suvirai 2010-08-16 13:59:17