数组索引方法一个棘手的案例

时间:2013-08-10 19:33:12

标签: c arrays pointers

#include<stdio.h>
int main() {
int buff[] = {1,2,3,4,5,6,9,10};
char c = (buff+1)[5];
printf("%d\n",c);//output is 9
return 0;
}

有人可以清楚地解释这是如何发生的以及为什么

2 个答案:

答案 0 :(得分:8)

<强>提取

在C中,方括号[ ]隐含*( ... )


您提供的代码片段中的内容是不明显的指针算法。这一行:

char c = (buff+1)[5];

...相当于以下(按C标准):

char c = *( ( buff + 1 ) + 5 );

...指向数组中的第7个元素(第6个位置)并取消引用它。它应输出9而不是19。

<强>注:

在关于方括号的注释之后,重要的是要看到以下内容是等效的。

arr[ n ] <=> n[ arr ]

...其中arr是一个数组,n是一个数值。一个更复杂的例子:

' '[ "]; i < 0; i++; while ( 1 ); do something awesome (y)." ];

......完全有效的指针算法。

答案 1 :(得分:6)

{1,    2,  3,  4,  5,  6,  9,  10};
 |     |
 buff  buff+1 = {2, 3, 4, 5, 6, 9, 10} (say buff_1)
                                |
 buff_1[5]    =                 9