C的一个指针运算问题

来源:百度知道 编辑:UC知道 时间:2024/06/18 11:18:06
int *p1, *p2;
int value;

p1 = (int *)0x500;
p2 = (int *) 0x508;
value = p2-p1;

为什么value输出的值是2?

p1,p2都是指针,所以指针的运算是求两个指针间的间隔(所指类型宽度的间隔)。

0x500 p1
0x501
0x502
0x503

0x504 p1+1
0x505
0x506
0x507

0x508 p1+2=p2
0x509
0x50a
0x50b

每个int型占4字节,所以p1每加上1,位置向后移一个int宽度(4)。

如果你把int *p1, *p2;换成double *p1,*p2;
就会得到 value=1;
因为double占8字节,sizeof(double)=8.

int *p1, *p2;
int value;

p1 = (int *)0x500;
p2 = (int *) 0x508;
value = p2-p1;

为什么value输出的值是2?
------------------------
在此对2的正确理解时,p2在p1的2个int字节长度后面。
根据上面反推来看,0x508-0x500=8字节, 8字节==2个int字节长度,所以你所在的机器上每个int是4个字节长度,即32位!

要看编译器的int字节长度

TC中,int是16位的,p2-p1就是4
VC中,int是32位的,p2-p1就是2

一楼没理解字节的含义。建议回去看看C基础。

p1,p2这是两个地址,两个地址之间相差8,正好是两个字节所以是2

因为是整型,每个整型占2个字节所以他们的首地址只差是2