在某些情况下,在ANSI-C中,是否可以在索引1而不是0中启动数组? (某些编译器选项保留在ANSI-C的定义下,而不是MACROS等)
e.g
int arr[2];
arr[2] = 5;
arr[1] = 4;
将是行为正常的有效代码。
答案 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个元素并声明一个超过所需要的元素。