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),而 *(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

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

最新更新