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

总结:

两个元素的地址相减,编译器会根据变量的数据类型来对结果进行右移操作,即结果是两个元素间(包括两个元素间的一个元素)有多少个元素,而不是地址的距离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值