使用指针代替整数变量
可能重复:
在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