大家對數組的使用再熟悉不過了吧?
來看下這個程序,挺簡單的。
1
#include<iostream>
2
int 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行。
發現了什么?
試下編譯一下看能不能通過?
把這個程序更加簡化
1
int a[5] =
{1,2,3,4,5};
2
int 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