关于C语言指针的操作问题

代码:

include

main(){
int a = 3 ;
int b = 4 ;
int *p1 ;
int *p2 ;
p1 = &a ;
p2 = &b ;
printf("%d\n",p1);
printf("%d\n",p2);
int c ;
c = p1 - p2 ;
printf("%d\n",c);
}
运行结果:
2293304
2293300
1


Process exited after 0.1434 seconds with return value 2
请按任意键继续. . .
问题:既然p1 = 2293304 . p2 = 2293300 .
c = p1 - p2 ; 那么c就应该是 4 啊。为什么结果是1 呢?这个1表示什么意思?

是p1和p2所指地址的单位差值,在这里是图片说明

指针运算的单位是多少个类型而不是多少个字节。
4个字节正好是1个int,所以是1啊。

如果按字节算,一个结构的指针 +48,移动了几个成员?你猜!你猜啊!!

c = (void *)p1 - (void *)p2;
这样就是4
指针想减得到的是地址差/sizeof(指针类型)

指针的这个特性使得它很方便对数组循环,比如
int *p = new int[10];
for (int i = 0; i < 10; i++)
*p++ = i;
每次正好移动到下一个整数的位置。

你现在计算的是地址的差值,不是指针所指向内容的差值
c=*p1-*p2就行了。