打印

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

[复制链接]
1179|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都定义为了指针类型,指针就是地址,不管你做不做强转,都是指针之间的运算。。。

使用特权

评论回复
5
火箭球迷| | 2012-2-21 22:54 | 只看该作者
LS分析的很对

使用特权

评论回复
6
gtekled| | 2012-2-22 16:44 | 只看该作者
来学习下!

使用特权

评论回复
7
wangc111| | 2012-2-22 16:49 | 只看该作者
围观下:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

193

主题

2354

帖子

0

粉丝