从1开始C数组

时间:2014-01-04 16:15:56

标签: c arrays

在某些情况下,在ANSI-C中,是否可以在索引1而不是0中启动数组? (某些编译器选项保留在ANSI-C的定义下,而不是MACROS等)

e.g

int arr[2];
arr[2] = 5;
arr[1] = 4;

将是行为正常的有效代码。

5 个答案:

答案 0 :(得分:9)

即可。

ANSI C中没有这样的东西。

答案 1 :(得分:3)

绝对不是,但你可以做的是添加一个额外的元素,如果它简化你的代码。

像:

const int maxPrimes = 5;
int primes[maxPrimes+1] = {-1,2,3,5,7,11};
int thirdPrime = primes[3];

答案 2 :(得分:0)

一个非常难看的解决方案:

int arr[2];
arr = arr - sizeof(int);
arr[2] = 5;
arr[1] = 4;

答案 3 :(得分:0)

理论上你可以做到:

int  realArray[100];
int* startingAtOneArray = `;

startingAtOneArray[1] = 5;

此作业等于:

*(startingAtOneArray + 1) = 5;

由于startingAtOneArray等于startingAtOneArray,我们得到:

*(realArray - 1 + 1) = 5;

这是:

realArray[0] = 5;

但这样做会非常强大,因为每个程序员都深深扎根于0开始的数组索引的概念。因此,这将导致非常奇怪的错误和混乱。

答案 4 :(得分:-1)

您可以将其作为宏

#define ARRAYDECL(lo,hi) int arrlo = lo, arrhi = hi, arr[hi - lo + 1]
#define ARR(x) arr[x - arrlo]

ARRDECL(-2,10);
ARR(-1) = 20;   /* Takes arr[1] */
kk = ARR(4);    /* Takes arr[6] */

另一种选择是忽略第0个元素并声明一个超过所需要的元素。