根據數組下標的定義(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];