c - 为什么我们声明 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]。有人可以解释为什么吗?
解决方案
您将length与index混淆了。对于长度为N的数组,索引是0到N-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 的数组的其他语言实际上必须减去该偏移量才能读取正确的内存位置。换句话说,他们是在伪造它。
推荐阅读
- stored-procedures - DB2-12 (Z/OS) - 为存储过程创建别名
- python - 如何使用 pywinauto 从“编辑”类 UI 控件中读取文本?
- angular - Angular:找不到管道“翻译”
- python - 在 models.py 中使用模型 -> 修复“django.core.exceptions.AppRegistryNotReady:模型尚未加载。”
- python - JSON缩进或没有
- spring-boot - 如果运行 spring boot 并让 liquibase 自动执行迁移,则 Liquibase databasechangelog 表存储相对路径
- postgresql - 码头工人撰写:postgres_1 | 错误:数据库未初始化且未指定超级用户密码
- nginx - nginx在反向代理中重写括号
- sharepoint - 如何使用 Http 请求和响应在 C# 中使用 Graph API?
- dart - 飞镖中的透视变换