使用指针订阅整数变量

Gha*_*san 3 c arrays subscription

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

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

int i;
i["]<i;++i){--i;}"];
Run Code Online (Sandbox Code Playgroud)

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

#include <stdio.h>

int main(void) {
    int x = 10;

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

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

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

谁能解释这个?

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

nos*_*nos 5

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

给定一个数组:

int array[5];
Run Code Online (Sandbox Code Playgroud)

然后

array[3]
Run Code Online (Sandbox Code Playgroud)

真的只是另一种语法

*(array + 3)
Run Code Online (Sandbox Code Playgroud)

因此,这与

*(3 + array)
Run Code Online (Sandbox Code Playgroud)

这意味着您也可以

3[array]
Run Code Online (Sandbox Code Playgroud)


Seb*_*ach 5

C11标准说明了这一点:

6.5.2.1,数组订阅

[...]

后缀表达式后跟方括号中的表达式[]是数组对象元素的下标名称.下标操作符的定义[]E1[E2]相同(*((E1)+(E2))).由于适用于binary +运算符的转换规则,if E1是一个数组对象(等效地,指向数组对象的初始元素的指针)并且E2是一个整数,因此E1[E2]指定E2-th 元素E1(从零开始计数).

注意:

E1[E2] 是完全相同的 (*((E1)+(E2)))

因此

 E1[E2] = E2[E1]
Run Code Online (Sandbox Code Playgroud)

.此外,

6.4.5字符串文字

[...]

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

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

"foobar"[x];
x["foobar"];
Run Code Online (Sandbox Code Playgroud)