大家對(duì)數(shù)組的使用再熟悉不過(guò)了吧?
來(lái)看下這個(gè)程序,挺簡(jiǎn)單的。
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
}
現(xiàn)在請(qǐng)仔細(xì)看第6行。
發(fā)現(xiàn)了什么?
試下編譯一下看能不能通過(guò)?
把這個(gè)程序更加簡(jiǎn)化
1
int a[5] =
{1,2,3,4,5};
2
int b = 1[a];
再來(lái)看下產(chǎn)生的匯編代碼
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
你沒(méi)有看錯(cuò),此刻這個(gè)數(shù)組春哥附體,a[1]的指向地址和1[a]是一樣的,都是[ebp-10h]。
Why?
我們回憶一下數(shù)組和指針的關(guān)系,如何用指針來(lái)表示數(shù)組?
*a 就是 數(shù)組 a中下標(biāo)為0的值的引用,即a[0],
那么*(a+i) 呢?
表示的就應(yīng)該是數(shù)組 a中下標(biāo)為i的值的引用了,即a[i],
那么這種現(xiàn)象也不足為怪了:
因?yàn)?*(a+i) == *(i+a)
所以 a[i] == i[a]
是不是感到 啊哈!靈機(jī)一動(dòng)(aha! Insight)了呢?
擴(kuò)展資料:《C陷阱與缺陷》p33~p38