天涼好個秋.

array[offset] 和 offset[array] 为什么是等效的?

763 阅 0 评 IT手札

一段代码

#include <stdio.h>
int main()
{ 
     int array[3]={0,1,2};
    printf("%d,%d,%d",*array,array[1],2[array]);
    return 0;
}

输出结果:

0,1,2

2[array]是什么鬼?

*array 等价于 array[0] 或者说 array 等价于 &array[0], 这个不用解释了吧。
那 2[array] 是什么鬼?
从输出结果不难猜出 2[array] 等价于 array[2],
但---这是为什么?

方括号的本质

方括号(square brackets)[]操作符的本质是什么呢?

编译器在分析表达式E1[E2] 时,方括号在语义上界定了参数 E1 和 E2,
然后将分离的参数组合成表达式 (*((E1)+(E2))),本质上仍然是指针的加法。
所以array[2]等价于(*((array)+(2)))
而2[array]等价于(*((2)+(array)))

我是如何知道的?

参考The C Programming Language
的 6.5.2.1 Array subscripting

这可能不是什么编程技巧,甚至一辈子也用不上的技巧,但是你需要理解它从何而来,才能更深入的理解c语言。

EOF