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

Kri*_*dar 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*ack 8

召回:

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


您提供的代码片段中发生的事情并不是明显的指针算法.这一行:

char c = (buff+1)[5];
Run Code Online (Sandbox Code Playgroud)

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

char c = *( ( buff + 1 ) + 5 );
Run Code Online (Sandbox Code Playgroud)

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

备注:

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

arr[ n ] <=> n[ arr ]
Run Code Online (Sandbox Code Playgroud)

... arr数组在哪里,n是一个数值.一个更复杂的例子:

' '[ "]; i < 0; i++; while ( 1 ); do something awesome (y)." ];
Run Code Online (Sandbox Code Playgroud)

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


P0W*_*P0W 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
Run Code Online (Sandbox Code Playgroud)