int test[] = {1,2,3,4};
printf("%i",3[test]);
这与test [3]相同怎么样? 我知道数组变量可以用作指向第一个元素的指针,可以用来引用或指向数组中的其他变量,但这个语句是如何正确的? 3这里不是数组变量。
答案 0 :(得分:2)
这个想法test[3]
实际上被视为*(test+3)
,与*(3+test)
相同,因为+
和3
通勤test
左右。因此3[test]
也是可能的。如果您将其写为*(3+test)
或*(test+3)
或test[3]
和3[test]
,则无关紧要。
来自6.5.2.1p2 C11标准
后缀表达式后跟方括号[]中的表达式是数组对象元素的下标名称。 下标运算符
[]
的定义是E1[E2]
与(*((E1)+(E2)))
相同。由于适用于binary +运算符的转换规则,如果E1是数组对象(等效地,指向数组对象的初始元素的指针)并且E2是整数,则E1 [E2]指定E2的第E2个元素。 E1(从零开始计算)。
E1[E2]
确实是*((E1)+(E2))
,我们知道二进制加法是commutative。我们可以说它与*((E2)+(E1))
相同,因此我们无法将其写为E2[E1]
。是的,我们可以,这是合法的。
答案 1 :(得分:0)
使用%i
或%d
时,它指定带符号的十进制整数。然后,为该整数分配的值由3[test]
表示。因此,%i
表示数组的第4个元素的值(因为数组指针以0开头)