1. 程式人生 > >對於結構體指標+、-常數的理解(page_to_pfn和pfn_to_page)

對於結構體指標+、-常數的理解(page_to_pfn和pfn_to_page)

昨天筆試也有這麼道題目,
int arrayTmp[10] = {0};
int nTmp = &arrayTmp[4]-&arrayTmp[0];
問nTmp = ?
當時想也沒想寫了nTmp = 16;
回家在機器上除錯運行了一下,結果nTmp=4。因為不常用這種方法,所以覺得很納悶兒。看了下反彙編的程式碼,發現:
int nTmp = &arrayTmp[4] - &arrayTmp[0];
00416B87  lea         eax,[ebp-28h] 
00416B8A  lea         ecx,[arrayTmp] 
00416B8D  sub         eax,ecx 

00416B8F  sar         eax,2 
00416B92  mov         dword ptr [nTmp],eax 
原來,執行完陣列地址相減運算後,還會執行算數右移指令,右移位數視引數型別而定,如int型右移2位,short型右移1位。都知道右移1位相當於除以2操作,右移2位等同於除以4。由此可見,兩個陣列元素地址相減,實際是獲取兩個元素陣列元素的距離,而不是地址的距離。如果要計算地址距離,就直接強制型別轉換:int nTmp = (char*)&arrayTmp[4] - (char*)&arrayTmp[0];