根据数组下标的定义(C标准,6.5.2.1数组下标)
2后缀表达式,随后在方括号表达式[] 是的一个元素的下标一个指定数组对象。下标运算符[]的定义为E1 [E2]等于 (*((E1)+(E2)))。由于适用于二元运算符 的转换规则,如果E1是一个数组对象(等同于指向数组对象的初始元素的指针 )且E2是整数,则E1 [E2]指定E2- E1的E1元素(从零开始计数)。
此声明
int sum = a[y-1] + a[y+1];
可以等效改写等
int sum = *(a + y - 1) + *(a + y + 1);
,这又可以被改写等
int sum = *((a + y) - 1) + *((a + y) + 1);
其中子表达式a + y
表示指针p
定义像
int *p = &a[y];
或(即相同)等
int *p = a + y;
因为根据标准转化(C标准,6.3.2.1左值,数组和功能指示器)
除了它是sizeof运算符的操作数或一元运算符,或者是用于初始化数组的字符串文本,一个 表达式的类型为'''的数组被转换为 表达式,其类型为指向类型''的指针,该指针指向数组对象的初始 元素并且不是左值。如果数组 对象具有寄存器存储类,则行为未定义。
因此,声明可以被改写像
int sum = *(p - 1) + *(p + 1);
现在再从C标准久违的第一次报价,我们得到
int sum = p[-1] + p[1];
反之亦然具有上述声明我们可以改写它像
int sum = *(p - 1) + *(p + 1);
考虑到p
定义等
int *p = a + y;
声明可以被重写等
int sum = *((a + y) - 1) + *((a + y) + 1);
或
int sum = *(a + (y - 1)) + *(a + (y + 1));
给出
int sum = a[y-1] + a[y+1];