可能重复:
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。
任何人都可以解释这个吗?
编辑:我发现下标中必须有一个指针,否则我会遇到编译时错误。
答案 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
恰好是字符串文字时,情况就是这样。