使用指针代替整数变量

可能重复:
在C数组中,为什么这是真的? a [5] == 5 [a]
奇怪的数组语法在多维数组中

今天我遇到了这个博客。 最吸引我的是这样的:

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

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

#include <stdio.h>

int main(void) {
    int x = 10;

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

    return 0;

}

它使用MinGW和-Wall -ansi -pedantic编译没有错误。 该代码然后输出:105。

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

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


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

  • v[5]
  • 5[v]
  • *(v + 5)
  • v碰巧是一个字符串时,它是一样的。


    C11标准说明了这一点:

    6.5.2.1,数组下标

    [...]

    后缀表达式后面跟着方括号[]的表达式,是数组对象元素的下标。 下标运算符[]的定义是E1[E2](*((E1)+(E2))) 。 由于适用于二进制+运算符的转换规则,如果E1是一个数组对象(等同于指向数组对象的初始元素的指针)并且E2是一个整数,则E1[E2]E2-th元素指定为E1 (从零开始计数)。

    注意:

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

    因此

     E1[E2] = E2[E1]
    

    。 此外,

    6.4.5字符串文字

    [...]

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

    所以它是有效的做到以下几点:

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

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

    给定一个数组:

    int array[5];
    

    然后

    array[3]
    

    实际上只是另一种语法

    *(array + 3)
    

    因此,这与之相同

    *(3 + array)
    

    这意味着你也可以做

    3[array]
    
    链接地址: http://www.djcxy.com/p/86725.html

    上一篇: Subscripting integer variable using a pointer

    下一篇: Why is 2[myArray] valid C syntax?