5

可能重复:
在 C 数组中,为什么这是真的?a[5] == 5[a]

我正在阅读有关 C 的教程,并且遇到了以下语法:

int doses[] = {1, 3, 2, 1000};
doses[3] == *(doses + 3) == *(3 + doses) == 3[doses]

现在的重点是得到int 1000,但最后一个没有任何意义。要么是晚了,我的大脑没有工作,要么是 C 特有的东西,要么是错字。当涉及到指针时,我想涵盖我所有的基础知识,因此请仔细阅读它。这意味着理解这一切。任何答案将不胜感激!

4

3 回答 3

7

来自维基百科

由于表达式 a[i] 在语义上等价于 *(a+i),而后者又等价于 *(i+a),因此表达式也可以写成 i[a],尽管这种形式很少使用。

于 2012-12-02T09:37:03.970 回答
2

是的,数组下标在 C 中是可交换的。e1[e2]确实与*((e1)+(e2)). 但它在生产代码中没有用,这种表示法的唯一目的是使源代码混淆。

于 2012-12-02T09:39:54.960 回答
0
ISO c99 : 6.5.2.1 Array subscripting

1
一个表达式的类型应为“指向对象类型的指针”,另一个表达式应为整数类型,结果的类型为“类型”。

E1[E2] either E1 will be pointer to object type and E2 will be integer type.

或者,

E1 is integer type and E2 is of pointer to that type

as+是可交换E1[E2] == E2[E1]的 so ,因为它实际上被评估为(*(E1+E2))

于 2012-12-02T09:38:53.397 回答