?

大家對數組的使用再熟悉不過了吧?
來看下這個程序,挺簡單的。

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