對於結構體指標+、-常數的理解(page_to_pfn和pfn_to_page)
阿新 • • 發佈:2019-01-29
昨天筆試也有這麼道題目,
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];
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];