指针的减法的注意事项
指针相减,结果可能不如你想的那样!!!
#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*类型指针不允许相减

浙公网安备 33010602011771号