int a[]={0,2,3,4,5};问a - &a[4]的值?解决方案
int a[]={0,2,3,4,5};问a - &a[4]的值?
int a[]={0,2,3,4,5};问a - &a[4]的值?
因为一个int是占四个字节,所以上面两个指针相减后的值应该是-16;
但我用int value = a-&a[4]后,value的值却是-4;我看了反汇编代码如下(VS2005):
29: int a[] = {0,2,3,4,5};
004123BE mov dword ptr [a],0
004123C5 mov dword ptr [ebp-14h],2
004123CC mov dword ptr [ebp-10h],3
004123D3 mov dword ptr [ebp-0Ch],4
004123DA mov dword ptr [ebp-8],5
30:
31: int value = a - &a[4];
004123E1 lea eax,[ebp-8]
004123E4 lea ecx,[a]
004123E7 sub ecx,eax //这个时候相减,ecx里保存的值应该是-16
004123E9 sar ecx,2 //但这句话把ecx的值右移两位,除了4,why?
004123EC mov dword ptr [value],ecx
从上面的汇编代码可以看到,在两个指针值相减后,把相减的值除了4,为什么这么做呢?请知情人士指点一下,谢谢.
------解决方案--------------------
-4嘛
指针相减,得到的结果并不是地址相减。二是这两个地址之间有多少个元素。
------解决方案--------------------
如果换成是指针变量a,那么(a+1)是指向了下一个元素,而不是移动了一个字节,换成你上面的例子道理也是一样的。
------解决方案--------------------
楼主,
一个数组的内存是连续的,
然后a代表首地址,
&a[4]代表第五个元素的地址,
a-&a[4]这是a和a[4]之间的元素个数,
这是因为a的类型是int*,
所以每次相减都是按int这四个字节来减的,
也就是说,
这并不是你要的指针地址之间的相减,
因为对数组来说,
a是个常指针,
它的地址也就是数组的首地址,
想做出指针相减,
可以
int *p=a;
int *q=p+4;
cout < <p-q < <endl; //这个和a-&a[4]一样,是-4
cout < <*p-*q < <endl; //这是元素的相减,0-5=-5
cout < <&p-&q < <endl; //这才是指针地址的相减,将是一个十六进制数
int a[]={0,2,3,4,5};问a - &a[4]的值?
因为一个int是占四个字节,所以上面两个指针相减后的值应该是-16;
但我用int value = a-&a[4]后,value的值却是-4;我看了反汇编代码如下(VS2005):
29: int a[] = {0,2,3,4,5};
004123BE mov dword ptr [a],0
004123C5 mov dword ptr [ebp-14h],2
004123CC mov dword ptr [ebp-10h],3
004123D3 mov dword ptr [ebp-0Ch],4
004123DA mov dword ptr [ebp-8],5
30:
31: int value = a - &a[4];
004123E1 lea eax,[ebp-8]
004123E4 lea ecx,[a]
004123E7 sub ecx,eax //这个时候相减,ecx里保存的值应该是-16
004123E9 sar ecx,2 //但这句话把ecx的值右移两位,除了4,why?
004123EC mov dword ptr [value],ecx
从上面的汇编代码可以看到,在两个指针值相减后,把相减的值除了4,为什么这么做呢?请知情人士指点一下,谢谢.
------解决方案--------------------
-4嘛
指针相减,得到的结果并不是地址相减。二是这两个地址之间有多少个元素。
------解决方案--------------------
如果换成是指针变量a,那么(a+1)是指向了下一个元素,而不是移动了一个字节,换成你上面的例子道理也是一样的。
------解决方案--------------------
楼主,
一个数组的内存是连续的,
然后a代表首地址,
&a[4]代表第五个元素的地址,
a-&a[4]这是a和a[4]之间的元素个数,
这是因为a的类型是int*,
所以每次相减都是按int这四个字节来减的,
也就是说,
这并不是你要的指针地址之间的相减,
因为对数组来说,
a是个常指针,
它的地址也就是数组的首地址,
想做出指针相减,
可以
int *p=a;
int *q=p+4;
cout < <p-q < <endl; //这个和a-&a[4]一样,是-4
cout < <*p-*q < <endl; //这是元素的相减,0-5=-5
cout < <&p-&q < <endl; //这才是指针地址的相减,将是一个十六进制数