指针的减法的注意事项

  指针相减,结果可能不如你想的那样!!!

#include <stdio.h>

int main()
{
  int a = 10;
  int b = 11;

  printf("a:%p\n",&a);
  printf("b:%p\n",&b);

  int* p1 = &a;
  int* p2 = &b;

  printf("%llx\n",((unsigned long long)(p1-p2)));

return 0;
}

  看下输出:

a:0x7ffda86d8b9c
b:0x7ffda86d8b98
1

为什么输出1??不是4呢?

 

做个更全面的实验

int a = 10;
  int b = 11;
  printf("a:%p\n",&a);
  printf("b:%p\n",&b);
  int* p1 = &a;
  int* p2 = &b;
  printf("%llx\n",((unsigned long long)(p1-p2)));

  char c = 1;
  char d = 2;
  printf("c:%p\n",&c);
  printf("d:%p\n",&d);
  char* pc = &c;
  char* pd = &d;
  printf("%llx\n",((unsigned long long)(pc-pd)));

  short e = 1;
  short f = 2;
  printf("e:%p\n",&e);
  printf("f:%p\n",&f);
  short* pe = &e;
  short* pf = &f;
  printf("%llx\n",((unsigned long long)(pe-pf)));

  输出:

a:0x7ffc33b5234c
b:0x7ffc33b52348
1
c:0x7ffc33b52347
d:0x7ffc33b52346
1
e:0x7ffc33b52344
f:0x7ffc33b52342
1

看见没?   都是1,但是两个地址相差的数值在不同类型是不一样的。

看到这里应该明白了,

        指针变量p1减p2的意义为:
        如果是正值,则表示在内存中p1比p2靠后
        如果是负值,则表示在内存中p1比p2靠前
        结果的数字表示, 两个地址在内存中间隔多少个指针类型的字节倍数
 
那么,不同类型的指针相减呢?

fileline.cpp: In function ‘int main()’:
fileline.cpp:29:43: error: invalid operands of types ‘char*’ and ‘short int*’ to binary ‘operator-’
printf("%llx\n",((unsigned long long)(pc-pf)));

编译器不允许!!

 

那么,如果void*指针相减呢?

  void *vpa = &a;
  void *vpb = &b;
  printf("vpa:%p\n",vpa);
  printf("vpb:%p\n",vpb);
  printf("%llx\n",((unsigned long long)(vpa-vpb)));

fileline.cpp: In function ‘int main()’:
fileline.cpp:35:45: error: invalid use of ‘void’
printf("%llx\n",((unsigned long long)(vpa-vpb)));

编译器不允许!!!

 

总结:

1、指针变量p1减p2的意义为:

        如果是正值,则表示在内存中p1比p2靠后
        如果是负值,则表示在内存中p1比p2靠前
        结果的数字表示, 两个地址在内存中间隔多少个指针类型的字节倍数
2、 不同类型指针不允许相减
3、void*类型指针不允许相减
posted @ 2020-02-07 16:46  ren_zhg1992  阅读(534)  评论(0)    收藏  举报