指针运算和地址运算的问题

[复制链接]
1985|6
 楼主| hsbjb 发表于 2012-2-21 16:16 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <stdlib.h>
main()
{
  char c,*cp1=&c,*cp2;
  int i,*ip1=&i,*ip2;
  double d,*dp1=&d,*dp2;
  cp2=cp1+1;
  ip2=ip1+1;
  dp2=dp1+1;
  printf("%d,%d,%d\n",cp2-cp1,ip2-ip1,dp2-dp1);
  printf("%d,%d,%d\n",(int)cp2-(int)cp1,(int)ip2-(int)ip1,(int)dp2-(int)dp1);
}
我用code::blocks编译器编译的,结果是:
1,1,1
1,4,8
为什么结果不是:
1,1,1,
1,2,8呢?
还有为什么(int)cp2-(int)cp1表示的是地址的运算呢?
yybj 发表于 2012-2-21 16:25 | 显示全部楼层
第一个问题:
因为在你的机器上sizeof(char) = 1byte, sizeof(int)=4bytes, sizeof(double)=8bytes
所以
cp2 - cp1 = 1 * sizeof(char)
ip2 - ip1 = 1 * sizeof(int)
dp2 - dp1 = 1 * sizeof(double)
也就分别是1,、4、8了。

第二个问题:
在目前32位的操作系统上,地址或者指针都是32位的,在你的机器上int也是32位的(4bytes),所以说,地址或者指针在绝对意义上来说,就是一个int(严格一点,通常是unsigned int),所以你将地址转型成int在这里是没有问题的。
无冕之王 发表于 2012-2-21 16:33 | 显示全部楼层
因为你的编译器中int型是占四个字节的,所以是1,4,8
无冕之王 发表于 2012-2-21 16:34 | 显示全部楼层
再次因为你定义char c,*cp1=&c,*cp2;是将cp1和cp2都定义为了指针类型,指针就是地址,不管你做不做强转,都是指针之间的运算。。。
火箭球迷 发表于 2012-2-21 22:54 | 显示全部楼层
LS分析的很对
gtekled 发表于 2012-2-22 16:44 | 显示全部楼层
来学习下!
wangc111 发表于 2012-2-22 16:49 | 显示全部楼层
围观下:lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

193

主题

2354

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部