一个C语言的指针与地址关系的问题

inta[3];a[0]=0;a[1]=1;a[2]=2;int*p,*q;p=a;q=&a[2];cout<<a[q-p]<<'\n';假设q的实际地址似乎0x22ff... int a[3];
a[0]=0;a[1]=1;a[2]=2;
int *p,*q;
p=a;
q=&a[2];
cout<<a[q-p]<<'\n';
假设q的实际地址似乎0x22ff70,p的实际地址是0x22ff68,0x22ff70-0x22ff68=8.
则q-p的实际运算时(0x22ff70-0x22ff68)/sizeof(int)=2;
我想问的是为啥q-p还要除以sizeof(int)啊?
展开
 我来答
kkss_kkss2
推荐于2016-04-18 · TA获得超过129个赞
知道小有建树答主
回答量:83
采纳率:100%
帮助的人:46.1万
展开全部
在c中,指针式可以运算的,比如p+1,p++ ,p+n等,但是这里的+1,+n到底是什么意思呢?注意不是真正的1,而是1个单位。一个什么单位呢,要看指针的类型。指针是int*,那么这里的+1就是+4个字节的意思,也就是+1个单位的int。如果指针式double*p,那么+1就是加1个double,也就是八个字节,如果是对象指针,也是同样。
你上面的例子q-p也不是简单的指针的值(地址)的差,而是他们两个之间的单位差,也就是qp之间差几个单位,他们是int*,也就是差几个int。所以不能用地址减完就收工,要处以4,得到单位差
kirkbd
2014-09-14 · TA获得超过321个赞
知道小有建树答主
回答量:394
采纳率:0%
帮助的人:176万
展开全部
因为你是要取第几位啊,这个a[]里的数是指第几位int型数据。(0x22ff70-0x22ff68)这个结果只是内存长度,而你要的下标是第几个int值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
鬼鬼Dn77
2014-09-14 · 超过71用户采纳过TA的回答
知道答主
回答量:128
采纳率:50%
帮助的人:64.2万
展开全部
指针保存了某个变量的地址
而指针本身其实也是一个变量,它也有自身的地址, 而指针的内容是某个变量的地址
内存是有地址的,就像每个具体的地方都对应了唯一一个地址一样
比如我在一张纸上写了某个地方的地址
这张纸不等于地址,但是通过这张纸,你可以找到这个地方
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
春天史努比
2014-09-14 · 超过39用户采纳过TA的回答
知道小有建树答主
回答量:112
采纳率:100%
帮助的人:63.4万
展开全部
也不是说(0x22ff70-0x22ff68)/sizeof(int),只是因为sizeof(int)刚好是一个字节的长度,c语言向你展示的已经是字节层级的距离了,也就是说两个指针之间相距两个字节的长度。因为对于编程而言,需要关心的最小单位是字节,位的距离对你是没有意义的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
freeeeeewind
2014-09-14 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1365万
展开全部
(q-p)/sizeof(int) 的意思是:q和p之间所包含整型数int 的个数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式