2
#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;
}

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

4

2 回答 2

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)." ];

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

于 2013-08-10T19:36:07.663 回答
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
于 2013-08-10T19:39:57.433 回答