两个指针之间的运算

 

只有指向同一数组的俩个指针变量之间才可以进行计算。否则是没有意义的。

两指针变量相减

两指针变量相减所得之差是俩个指针所指数组之间相差的元素个数。实际上是俩个指针值(地址)相减之差再除以该数组元素的长度(字节数) 
注意:因为俩个指针相加没有任何意义,所以别乱搞。

int* pf1, *pf2; 
int arr[10] = {0}; 
pf1 = arr; 
pf2 = arr+1; 
auto result = pf2 - pf1;
 
计算机具体运算是两个地址值相减。应该是重载了运算符“-”,结果是指针值相减除以指针所指对象的大小。因为单纯的地址值相减就会和指针所指的对象有关系,所指对象不同那么它的偏移量就会不同。比如,所指的是字符型相减就是1,如果是双精度型那么就是是8。然而如果重载了之后指针相减了就仅仅是为了表示指针所指元素的距离。再说一遍这只是在连续的内存块中才有意义(数组)。那么接下来这行代码就有意思了。

auto result = (char*)pf2 - (char*)pf1; 
这行代码得出的结果是4,没错你没有看错。最后的结果就是4。因为重载的运算机制如下:

那么偏移量怎么计算呢?就是两个指针的实际的差值。如果你通过强制转换成字符型(char)那么分母的大小就是1而不是4,这样的话就是扩大了四倍。最后就是得出结果就是元素的距离乘以扩大的倍数。最终得出的结果就是4。 

指针相减是指两个指针值(地址)相减之差再除以该数组元素的长度(字节数)的意思了吧!上次回答:得到 (指针尾 - 指针头)/ sizeof(数组的类型) = 中间有几个元素;
但是 / sizeof(类型) 编译器已经帮我们实现好了.所以就无需我们做这一步

请教一下,这个的结果是什么?关于两个指针相减的问题
p1=(int *)ox0500;
p2=(int *)ox0518;
value=p2-p1;
printf(“%d”,value)

p1=(int *)ox0500;
p2=(int *)ox0518; 这两句是吧 0x0500和0x0518这两个16进制数强制的作为Int型变量的地址。两个Int型变量的地址之差就是这两个地址中间可以有多少个int型变量。(这是因为C语言可以根据变量的类型来决定地址增加的实际空间。比如你定义一个int指针int *p,p=p+1时,其实在内存地址中实际加4,因为int在C中4个字节。)
0x0518-0x0500=24  24/4=6  所以结果应该为6 即两个地址之间可以有6个int变量的空间。

两指针变量进行关系运算

指向同一数组的俩个指针变量进行运算可以表示它们所指数组元素之间的关系,比如:

  • pf1 == pf2 表示指向同一元素。
  • pf1 > pf2 表示pf1处在高地址位置。
  • pf1 < pf2 表示pf1 处在低地址位置。

猜你喜欢

转载自blog.csdn.net/weixin_40539125/article/details/81163230