2010-08-16 66 views
2

的索引到目前为止,即时通讯与第0的位置,但在需要将其从改变米阵列上工作0到1,使得如果较早它开始为0至n-1,则现在应开始形式1至ñ。有什么方法可以解决这个问题吗?改变阵列

+1

您是否试图将数组中的所有元素向前移动一次,例如:{1,2,3} => {_,1,2,3}' 或者您是否可以更改索引在C中从1开始而不是0开始? – linuxuser27 2010-08-16 06:27:45

+0

从1开始而不是0 – suvirai 2010-08-16 13:59:17

回答

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

6

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

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

+0

出于好奇。反正,在功能的帮助下如何做到这一点? 我想知道,如果你能提供任何帮助。 – suvirai 2010-08-16 06:29:37

+0

如果您对数组索引真的很好奇,您可以查看FORTRAN,它可以让您更改索引范围。然后可以使用索引-5至5(包括0)将数组MYARRAY编入索引。 – linuxuser27 2010-08-16 06:33:57

+0

Didier在下面的建议很聪明,否则你可以这样做:'int GetElement(int xs [],int index){return xs [index - 1]; }'然后使用'GetElement(xs,1);'访问第一个元素'' – 2010-08-16 06:34:33

5

数组索引在C中从零开始;你不能改变这一点。

如果你已经具体要求/设计的方案是有道理的一个开始索引,声明数组是长度为n + 1的,只是不使用零位置。

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; 

但我会建议这样做。

+6

我认为这会导致未定义的行为。 – GManNickG 2010-08-16 06:35:04

+2

是的,通过C99§6.5.6/ 8,你不允许通过添加到数组内部的地址来在阵列外形成一个地址(除了结尾之外的地址)。 – Potatoswatter 2010-08-16 07:56:13

0

为什么数组为零的一些更多的参数可以找到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个索引,用于某些隐藏目的,遗憾的是他并不知道。