Why is 2[myArray] valid C syntax?
复制
In C arrays why is this true? a[5] == 5[a]
号
给定一个数组
1
| myArray[5] = { 0, 1, 2, 3, 4 }; |
元素可以访问为
号
为什么?当我看到这个表达式时,我想象C试图访问指针"2",但未能添加"myarray"指针增量来取消对该地址的引用。我错过了什么?
- 重复:stackoverflow.com/questions/381542/…。
- @巴斯蒂安:谢谢,我在找那个,但好像找不到。
- 这是C的一个真正邪恶的"特征"。
在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)
- Eric:数组(实际上是指针)的实现方式取决于实现。它不需要,而且通常不需要,像in t这样的东西来表示。指针占用的空间可能超过int所能容纳的空间。例如,在当前的64位系统中,这是典型的,但不是必需的。此外,DOS系统中的远指针通常表示为两个16位字(单独的段和偏移量)。指针不是算术类型,不能与int或int进行可移植的转换。
- 哇,太神奇了-25年的变量名不能以数字开头。
- 凯文蒂姆:我觉得你有点困惑。变量(标识符)不能以数字开头是正确的。使用3[a]时,您的标识符拼写为"a",其中没有数字。它在语义上与*(3+a)相同,后者与*(a+3)相同,后者与[3]相同。
- 历史记录:cm.bell-labs.com/cm/cs/who/dmr/chist.html。是V!i表示BCPL,它在索引i处索引数组v。对称性直接显示在那里。