理解C数组和指针

Den*_*nny 5 c arrays printf pointers

需要一些帮助来了解此代码段中究竟发生了什么.当我运行该程序时,它打印7.

#include <stdio.h>
int main() {
int a[] = {1,2,3,4,5,6,7,8,9};
int b[] = {1,2,3,4,5,6,7,8,9};
int c = 5;
int *p = a;
printf("--> %d", (c[b])[p]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

当涉及到printf语句中的(c [b])[p]部分时,我只是有点困惑.任何帮助/解释将不胜感激.

Car*_*rum 13

以这种方式编写有点奇怪,但[]C中的运算符是可交换的.这意味着(c[b])[p]相同p[b[c]],这更容易理解:

p[b[c]] = p[b[5]] = p[6] = a[6] = 7
Run Code Online (Sandbox Code Playgroud)

对原始表达式执行相同操作也会起作用,在某些地方查看它有点奇怪:

(c[b])[p] = (5[b])[p] = (b[5])[p]) = 6[p] = p[6] = a[6] = 7
Run Code Online (Sandbox Code Playgroud)

交换性(如果[]只是一个词)只是由于它的定义 - 也就是说,a[b]它是相同的*(a + b),在那里你可以看到顺序ab无关紧要.