Subscripting integer variable using a pointer
Possible Duplicate:
In C arrays why is this true? a[5] == 5[a]
C weird array syntax in multi-dimensional arrays
号
今天我看到了这个博客。最吸引我的是:
1 2 | int i; i["]<i;++i){--i;}"]; |
好吧,我真的不知道数组下标中奇怪的"字符串常量"的用途是什么,但是我很困惑如何下标一个整型变量。所以我带着这个密码来了:
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main(void) { int x = 10; printf("%d", x["\0"]); /* What is x["\0"]?! */ return 0; } |
号
它使用mingw和-wall-ansi-pedantic编译而不出错。此代码随后输出:105。
有人能解释这个吗?
编辑:我发现在下标中必须有一个指针,否则我会得到编译时错误。
C11标准规定:
6.5.2.1, Array Subscripting
[...]
A postfix expression followed by an expression in square brackets
[] is a subscripted
designation of an element of an array object. The definition of the subscript operator[]
is thatE1[E2] is identical to(*((E1)+(E2))) . Because of the conversion rules that
apply to the binary + operator, ifE1 is an array object (equivalently, a pointer to the
initial element of an array object) andE2 is an integer,E1[E2] designates theE2-th
element ofE1 (counting from zero).
号
注:
E1[E2] is identical to(*((E1)+(E2)))
号
因此
1 | E1[E2] = E2[E1] |
。
. 此外,
6.4.5 String Literals
[...]
The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type
char
号
因此,进行以下操作是有效的:
1 2 | "foobar"[x]; x["foobar"]; |
。
这是数组索引工作方式的结果:
给定数组:
1 | int array[5]; |
然后
1 | array[3] |
号
实际上只是
1 | *(array + 3) |
因此,这与
1 | *(3 + array) |
。
这意味着你也可以
1 | 3[array] |
这是一个众所周知的伎俩。由于指针算法的工作方式,以下是同义词:
v[5] 。- 江户十一〔一〕号
- 埃多克斯1〔2〕
当