C数组算术和指针

时间:2012-12-02 09:34:17

标签: c arrays pointers integer-arithmetic

  

可能重复:
  In C arrays why is this true? a[5] == 5[a]

我正在阅读关于C的教程,我遇到了这种语法:

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

现在重点是获得int 1000,但最后一个没有任何意义。要么它的晚期和我的大脑没有运作,它的特定于C的东西,或它的错字。我想在指针上涵盖我所有的基础知识,仔细阅读它。这意味着要理解这一切。任何答案都将非常感谢!

3 个答案:

答案 0 :(得分:7)

来自Wikipedia

  

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

ISO c99 : 6.5.2.1 Array subscripting

1
 其中一个表达式应具有类型''指向对象类型的指针'',另一个表达式应该 具有整数类型,结果类型为''type''。

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

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