为什么这样做?阵列访问不正常

Why does this work? Illogical array access

本文关键字:访问 不正常 阵列 这样做 为什么      更新时间:2023-10-16

我的一个朋友第一次学习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]]

不过不要用这个"事实"。正如您所看到的,它使代码不可读,而不可读的代码是不可维护的。