关于C#:使用指针订阅整数变量

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 that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
element of E1 (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〕

v恰好是字符串文字时,情况也是一样的。