1. 程式人生 > 其它 >C語言中對變數取地址相加減

C語言中對變數取地址相加減

技術標籤:c++c語言

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的結果。

總結:

兩個元素的地址相減,編譯器會根據變數的資料型別來對結果進行右移操作,即結果是兩個元素間(包括兩個元素間的一個元素)有多少個元素,而不是地址的距離