理解C语言中的数组和指针

5

需要一点帮助理解这段代码究竟在做什么。 当我运行程序时,它会打印出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;
}

我对 printf 语句中的 (c[b])[p] 部分感到有些困惑。希望能得到协助和解释。

3
c[b] 的意思与 *(c + b) 相同。这应该会有所帮助。 - bzeaman
可能是在C语言中,数组名是指针吗?的重复问题。 - jww
@BennoZeeman 你忘记了一些括号。它们很重要。例如,看看当前的答案。 - user3920237
更完整的解释在使用C数组时,为什么a[5] == 5[a]? - Jongware
2
@remyabel 谢谢,你是正确的。我刚刚查了一下C标准,他们提到 E1[E2] 等同于 (*((E1)+(E2))) - bzeaman
1个回答

13

虽然这样写有点奇怪,但在 C 语言中,[] 运算符是可交换的。这意味着 (c[b])[p]p[b[c]] 是相同的,后者更容易理解:

p[b[c]] = p[b[5]] = p[6] = a[6] = 7

使用原始表达式也可以做到同样的效果,只是在某些地方看起来有点奇怪:

(c[b])[p] = (5[b])[p] = (b[5])[p]) = 6[p] = p[6] = a[6] = 7

[]的可交换性(如果这是一个词)只是由其定义决定的 - 也就是说,a[b]*(a+b)相同,您可以看到ab的顺序并不重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接