首页 > 解决方案 > 为什么我们声明 2d 数组具有基于 1 的索引,但我们在 C 语言中使用基于 0 的索引访问数组?

问题描述

`int main()
{
int nums[3][2] = {{1, 2}, {3, 4}, {5, 6}};
printf("%d", nums[2][1]); 
return 0;
}`

在这里,如果我想访问数组的最后一个元素,我会使用 [2][1] 但要命名数组,我会使用基于 1 的索引并使用 [3][2]。有人可以解释为什么吗?

标签: carrays

解决方案


您将lengthindex混淆了。对于长度为N的数组,索引是0N-1

那是:

int x[3];

意味着x[0]x[1]并且x[2]存在。有 3 个条目,编号为 0 .. 2。

长度只是“基于 1”的,因为当我们谈论长度为 1 的数组时,我们通常是指它可以容纳一个条目,因为这就是人类倾向于计数的方式。然而,索引是从 start 开始的偏移量,因为它实际上是 C 内部工作方式的产物:

x[n] // Array notation
*(x + n) // Pointer notation

当您说x[0]“在数组的开头应用零偏移量并读取值”时,即使生成的机器指令看起来更像第一个解释,也可以翻译成人类术语“读取第一个元素” .

实现基于 1 的数组的其他语言实际上必须减去该偏移量才能读取正确的内存位置。换句话说,他们是在伪造它


推荐阅读