为什么这个工作? 不合逻辑的数组访问

可能重复:
在C数组中,为什么这是真的? a [5] == 5 [a]

我的一个朋友第一次学习C ++,并且给我发了这个片段:

int foo[] = { 3, 38, 38, 0, 19, 21, 3, 11, 19, 42 };
char bar[] = " abcdefghijklmnopqrstuvwxyz01234567890+-,.!?-_";
for (int i = 0; i < 10; ++i) {
  std::cout << foo[i][bar];
}

乍一看,我告诉他它不会工作 - 我认为它不会编译,或者至少会导致访问冲突,因为foo不是一个二维数组,他回答说它确实如此。

我为自己而努力,而令我惊讶的是,片段运行得非常好。 问题是:为什么?

根据逻辑,常识和良好实践,语法应该是bar[foo[i]]

我很惭愧地承认我不知道发生了什么。 在这种情况下, foo[i][bar]有效的语法是什么?


简单来说,在C中(并且在C ++中,当[]未被重载时)访问数组元素如下:

x[i] = *(x + i)

所以,有了这个和一点算术......

  foo[i][bar]
= (foo[i])[bar]
= (*(foo + i))[bar]
= *((*(foo + i)) + bar)
= *(bar + (*(foo + i)))
= bar[*(foo + i)]
= bar[foo[i]]

不要使用这个“事实”。 正如你所看到的,它使得代码不可读,而不可读的代码是不可维护的。

链接地址: http://www.djcxy.com/p/15211.html

上一篇: Why does this work? Illogical array access

下一篇: Passing a String by Reference in Java?