【问题标题】:Subscripting integer variable using a pointer [duplicate]使用指针下标整数变量[重复]
【发布时间】:2012-07-05 13:47:02
【问题描述】:

可能重复:
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。

谁能解释一下?

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

【问题讨论】:

    标签: c arrays subscription


    【解决方案1】:

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

    给定一个数组:

    int array[5];
    

    然后

    array[3]
    

    实际上只是另一种语法

    *(array + 3)
    

    因此与

    相同
    *(3 + array)
    

    这意味着你也可以这样做

    3[array]
    

    【讨论】:

      【解决方案2】:

      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"];
      

      【讨论】:

        【解决方案3】:

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

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

        v 恰好是字符串字面量时也是如此。

        【讨论】:

        • 好吧,严格来说,这不是指针算术的本质,而是由于语言标准的特殊性。该标准还可以禁用使用数组对 int 进行索引,而不会对语言造成任何实际损失。
        • 我不确定它是否“众所周知”,虽然
        • @nos:是的。但是其他语言以“更类型友好的方式”定义索引,要求被索引的变量(而不是索引)是一个数组。对于C来说,当只有一个操作数是数组的时候,加法有特殊的意义,这很奇特。
        猜你喜欢
        • 2021-11-11
        • 1970-01-01
        • 2016-05-29
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2014-03-29
        相关资源
        最近更新 更多