两个指针相减

如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目。

     假设我住在广场路124号,Mag住在广场路142号,每家之间的地址间距是2(在我这一侧用连续的偶数作为街道地址),那麽Mag家就在我家往前(142-124)/2家,也就是说可以得到我们两家之间相隔8家。


     也就是说可以利用两个指向同一数组的指针相减得到两个指针之间元素的个数。


     如果两个指针不是指向同一个数组,它们相减就没有意义了。


     C本身无法防止非法的指针减法运算,它无法为你提出任何警告或提示。


     指针相减的结果是某种整类型的值,为此,ANSI C标准<stddef.h>头文件中预定义了一个整类型ptrdiff_t。尽管在不同的编译程序中ptrdiff_t的类型可能各不相同,但它们都适当地定义了ptrdiff_t类型。


     把指针强制转换成指向纯粹的内存地址的指针,通常就是转换成void*类型,但是在本例中将指针强制转换成char*类型,因为void*类型的指针之间不能进行减法运算。
 
  #include <stdio.h>
  #include <stddef.h>
  
  struct stuff{
          char name[16];
  };
  
  struct stuff array[]={
          {"The"},
          {"quick"},
          {"brown"},
          {"fox"},
          {"jumped"},
          {"over"},
          {"the"},
          {"lazy"},
          {"dog."},
          {""}
  }
  
  main()
  {
    struct stuff   *p0= & array[0];
    struct stuff   *p8= & array[8]; 
    ptrdiff_t      diff=p8-p0; 
    ptrdiff_t      addr_diff=(char*)p8-(char*)p0;
    
    printf("&array[0]=p0=%P/n",(void*)p0);
    printf("&array[8]=p8=%P/n",(void*)p8);
    
    printf("The difference of pointers is %ld/n",(long)diff); 
    printf("The difference of addresses is %ld/n",(long)addr_diff);
    printf("p8-8=%P/n",(void*)(p8-8));
    
    printf("p0+8=%P(same as p8)/n",(void*)(p0+8));
    return 0;
  }           
  



     本例演示了指针的减法运算。该例中有一个结构体数组,每个结构体的长度都是16字节。如果是对指向结构体数组的指针进行减法运算,则a[0]和a[8]之 间的距离为8,如果将结构体数组的指针强制转换成指向纯粹的内存地址的指针之后再相减,则a[0]和a[8]之间的距离为128。如果将指向a[8]的指 针减去8,该指针所指向的位置并不是往前移了8个字节,而是往前移了8个数组元素。
  • 18
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值