大家对数组的使用再熟悉不过了吧?
来看下这个程序,挺简单的。

1#include<iostream>
2int main()
3{
4    int a[] = {1,2,3,4,5};
5    for(int i = 0 ; i < 5; i++)
6        std::cout << i[a] << " ";
7    return 0;
8}


现在请仔细看第6行。
发现了什么?
试下编译一下看能不能通过?


把这个程序更加简化

1int a[5= {1,2,3,4,5};
2int b = 1[a];


再来看下产生的汇编代码
4:       int a[5] = {1,2,3,4,5};
00401568   mov         dword ptr [ebp-14h],1
0040156F   mov         dword ptr [ebp-10h],2
00401576   mov         dword ptr [ebp-0Ch],3
0040157D   mov         dword ptr [ebp-8],4
00401584   mov         dword ptr [ebp-4],5
5:        int b = 1[a];
0040158B   mov         eax,dword ptr [ebp-10h]
0040158E   mov         dword ptr [ebp-18h],eax

你没有看错,此刻这个数组春哥附体,a[1]的指向地址和1[a]是一样的,都是[ebp-10h]。

Why?

我们回忆一下数组和指针的关系,如何用指针来表示数组?
*a  就是 数组 a中下标为0的值的引用,即a[0],
那么*(a+i) 呢?
表示的就应该是数组 a中下标为i的值的引用了,即a[i],
那么这种现象也不足为怪了:
因为 *(a+i)  == *(i+a)
所以 a[i] == i[a]

是不是感到 啊哈!灵机一动(aha! Insight)了呢?

扩展资料:《C陷阱与缺陷》p33~p38