使用指针订阅整数变量

时间:2012-07-05 13:47:02

标签: c arrays subscription

  

可能重复:
  In C arrays why is this true? a[5] == 5[a]
  C weird array syntax in multi-dimensional arrays

今天我遇到了这个blog。吸引我最多的是:

int i;
i["]<i;++i){--i;}"];

好吧,我真的不知道数组下标中奇怪的“字符串常量”的目的是什么,但我很困惑如何下标整数变量。所以我带来了这段代码:

#include <stdio.h>

int main(void) {
    int x = 10;

    printf("%d", x["\0"]); /* What is x["\0"]?! */

    return 0;

}

使用带有 -Wall -ansi -pedantic 的MinGW进行编译时没有错误。然后该代码输出:105。

任何人都可以解释这个吗?

编辑:我发现下标中必须有一个指针,否则我会遇到编译时错误。

3 个答案:

答案 0 :(得分:5)

这是数组索引如何工作的结果:

给定一个数组:

int array[5];

然后

array[3]

实际上只是

的另一种语法
*(array + 3)

因此与

相同
*(3 + array)

这意味着你也可以做到

3[array]

答案 1 :(得分:5)

C11标准说明了这一点:

  

6.5.2.1,数组订阅

     

[...]

     

后缀表达式后跟方括号[]中的表达式是下标   指定数组对象的元素。下标运算符[]的定义   是E1[E2](*((E1)+(E2)))相同。由于转换规则   如果E1是一个数组对象(等效于指向。的指针),则应用于binary +运算符   数组对象的初始元素)和E2是一个整数,E1[E2]表示E2-th   E1的元素(从零开始计算)。

注意:

  

E1[E2](*((E1)+(E2)))

相同

因此

 E1[E2] = E2[E1]

。此外,

  

6.4.5字符串文字

     

[...]

     

然后用于初始化静态存储数组的持续时间和长度,足以包含序列。对于字符串文字,数组元素的类型为char

所以执行以下操作是有效的:

"foobar"[x];
x["foobar"];

答案 2 :(得分:4)

这是一个众所周知的伎俩。由于指针算法的工作方式,以下是同义词:

  • v[5]
  • 5[v]
  • *(v + 5)

v恰好是字符串文字时,情况就是这样。