#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;
}
有人可以清楚地解释这是如何发生的以及为什么
记起:
在 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, 2, 3, 4, 5, 6, 9, 10};
| |
buff buff+1 = {2, 3, 4, 5, 6, 9, 10} (say buff_1)
|
buff_1[5] = 9