C数组算术和指针
可能重复:
在C数组中,为什么这是真的? a [5] == 5 [a]
我正在阅读关于C的教程,并且我遇到了这个语法:
int doses[] = {1, 3, 2, 1000};
doses[3] == *(doses + 3) == *(3 + doses) == 3[doses]
现在的重点是获得int 1000
,但最后一个没有任何意义。 无论是迟到还是我的大脑都不能正常工作,它是C特有的,还是它的错字。 我想在涵盖所有基本知识的时候仔细阅读指针。 这意味着理解这一切。 任何答案将不胜感激!
从维基百科
由于表达式a [i]在语义上等价于*(a + i),而它相当于*(i + a),所以表达式也可以写成i [a],尽管这种形式很少使用。
是的,数组下标在C中是可交换的e1[e2]
的确与*((e1)+(e2))
。 但是它在生产代码中是没用的,这个表示法的唯一目的就是制作混淆的源代码。
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]
,因为它实际上评估为(*(E1+E2))