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