以下C代码在做什么?
int i;
int* p = &i;
0[p] = 42;
我希望这不会是事件编译。但它甚至在没有分段错误的情况下执行。所以我想知道我错过了[]
运算符的奇怪用法。
答案 0 :(得分:13)
C标准以这种方式定义了运算符[]
:
无论a
和b
是a[b]
被视为*((a)+(b))
这就是为什么0[p] == *(0 + p) == *(p + 0) == p[0]
是数组的第一个元素。
答案 1 :(得分:9)
0[p]
相当于p[0]
。两者都转换为
0[p] = *(0+p) and p[0] = *(p+0)
从上述陈述两者都是平等的。
答案 2 :(得分:7)
0[p]
0[p] = 42;
中的
相当于p[0]
+
操作是可交换的,我们有:
p[0] == *(p + 0) == *(0 + p) == 0[p]