【问题标题】:Why is 2[myArray] valid C syntax? [duplicate]为什么 2[myArray] 是有效的 C 语法? [复制]
【发布时间】:2010-10-25 07:46:43
【问题描述】:

复制

In C arrays why is this true? a[5] == 5[a]


给定一个数组

 myArray[5] = { 0, 1, 2, 3, 4 };

一个元素可以被访问为

 2[myArray]

为什么?当我看到这个表达式时,我想象 C 试图访问指针“2”并且未能添加“myArray”指针增量以取消引用该地址。我错过了什么?

【问题讨论】:

标签: c arrays syntax pointers


【解决方案1】:

在 C 中,a[b] 等价于 *(a + b)。当然,+ 运算符是可交换的,所以 a[b] 与 b[a] 相同 与 *(b + a) 相同 与 *(a + b) 相同。

【讨论】:

  • 值得指出的是,在 C 中,myArray 本质上是一个包含指针地址的 int 变量,这就是该属性起作用的原因。括号告诉它评估指针以在寻址的内存块中查找数据。它不会先尝试访问内存,然后添加索引;它将指针和索引加在一起,然后访问内存。这种方法效率更高,因为您访问的不是两个地址,而是一个。
  • 非常感谢 - 我知道以前向我解释过,但不太记得了。
  • +1,绝对清楚:a[2] == *(a+2) == 2[a] == *(2+a)
  • kevindtimm:我觉得你有点困惑。您是正确的,变量(标识符)不能以数字开头。使用 3[a] 您有一个拼写为“a”的标识符,其中没有数字。它在语义上等同于 *(3 + a),后者等同于 *(a + 3),后者等同于 a[3]。
  • 这里是历史记录:cm.bell-labs.com/cm/cs/who/dmr/chist.html。 BCPL 是 V!i,它在索引 i 处索引了数组 V。对称性直接显示在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多