C語言中對變數取地址相加減
阿新 • • 發佈:2021-01-28
C語言中對變數取地址相加減
專案場景:
int arr[10] = {0};
int a= &arr[9]-&arr[0];
在理解中,兩個地址相加減獲得的應該是這兩個變數之間的距離,即相隔多少位元組,得出a=36;然而對於結果:a=9;
原因:
在彙編程式碼中:
00416B87 lea eax,[ebp-28h]
00416B8A lea ecx,[arr]
00416B8D sub eax,ecx
00416B8F sar eax,2
00416B92 mov dword ptr [ a],eax
執行完陣列地址相減運算後,還會執行算數右移指令,右移位數視引數型別而定,如int型右移2位,short型右移1位。都知道右移1位相當於除以2操作,右移2位等同於除以4。由此可見,兩個陣列元素地址相減,實際是獲取兩個元素陣列元素的距離,而不是地址的距離。
延展:
對於陣列有這種現象,那麼其他型別的變數是否在取址相加減後,會不會根據資料型別而進行右移>>操作;
int main(){
int a,b;
printf("%p\n",&a);
printf("%p\n",&b);
printf ("%d\n",&b-&a);
return 0;
}
兩地址相隔4個位元組,而運算得到了-1的結果。
總結:
兩個元素的地址相減,編譯器會根據變數的資料型別來對結果進行右移操作,即結果是兩個元素間(包括兩個元素間的一個元素)有多少個元素,而不是地址的距離