地址加减问题..

小曦子 2009-01-07 03:55:53
code=C/C++]
int x = 56,y = 65,*p;//p=0xcccccccc
p = &x;//&x=0x0013ff7c
p = &y;//&y=0x0013ff78
*p = 85;
++p;//++后P的地址指向x的地址
--p;//同理指向y
p = p - 2;//就是这里有点不懂..为何地址减2后会变为0x0013ff70它是怎么减的..请各位指教一下
*p = *(p + 2);//同上面一个问题..
[/code]
...全文
229 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianma2005123 2009-01-07
  • 打赏
  • 举报
回复
LS的兄弟们说的真清楚。。。
silverice 2009-01-07
  • 打赏
  • 举报
回复
指针的加减,不是算数加减,而是相当于按照指针表示的对象的大小进行在内存中的前后移动。
1楼的解释已经比较清楚了
lsd1025 2009-01-07
  • 打赏
  • 举报
回复
指针地址加减1,其实是加减一个指针类型长度的地址,
32位机指针都是int型的4byte,减p-2就是地址减2*4 加2就是加2*4
小曦子 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 anglecloudy 的回复:]
引用 5 楼 ytfsse 的回复:
还有个问题就是为何地址是从大到小呢???


计算机中栈分配的地址都是从高到底
堆中分配的都是从低到高的
组成原理里面的知识
[/Quote]
那什么会执行堆操作何时栈操作.???
还有那个全局静态常量会在哪个区???



多谢各位指点呀
太乙 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ytfsse 的回复:]
还有个问题就是为何地址是从大到小呢???
[/Quote]

栈地址,是一个栈,后进先出

下面:

------------------------
| 低地址 |
| |
| |
| |
| |
| 高地址 |
------------------------


所以先定义的x放入高地址,然后y放入的低地址


tangshuiling 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ytfsse 的回复:]
还有个问题就是为何地址是从大到小呢???
[/Quote]
栈地址是从高地址区开始向低地址区做压栈操作
太乙 2009-01-07
  • 打赏
  • 举报
回复
呵呵,对于p++,++p,p--,--p这些,是按照p指向的类型来决定偏移多少的!

对于p+2,p-2,后面的2也是按照p指向的类型来决定的

对于p是一个int的指针,那么偏移一次就是4个字节

所以p- 2 = 0x0013ff78 - 4*2 = 0x0013ff70
OenAuth.Net 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ytfsse 的回复:]
还有个问题就是为何地址是从大到小呢???
[/Quote]

计算机中栈分配的地址都是从高到底
堆中分配的都是从低到高的
组成原理里面的知识
xiaoyisnail 2009-01-07
  • 打赏
  • 举报
回复
指针的算术运算由编译器根据指针类型经过调整的
对于type* p,p+n,编译器会调整为p+n*sizeof(type)
fancy_zhh 2009-01-07
  • 打赏
  • 举报
回复
code=C/C++]
int x = 56,y = 65,*p;//p=0xcccccccc
p = &x;//&x=0x0013ff7c
p = &y;//&y=0x0013ff78
*p = 85;
++p;//++后P的地址指向x的地址
--p;//同理指向y
p = p - 2;//就是这里有点不懂..为何地址减2后会变为0x0013ff70它是怎么减的..请各位指教一下

这里减2表示地址 用原来的地址(0x0013ff78) - 2 * sizeof(int*),那么结果显然就是0x0013ff70了
2 * sizeof(int*) = 8

*p = *(p + 2);//同上面一个问题.. 这里得到的*p的值显然就是y的值
[/code]
tangshuiling 2009-01-07
  • 打赏
  • 举报
回复
楼主自己体会一下
++p 这里实际就是p+1(p从0x0013ff78 到0x0013ff7c )
p-1 (p从0x0013ff78 到0x0013ff74)
p再减一,p-1 (p从0x0013ff74 到0x0013ff70)
递增是4个字节,那递减不也是4个字节
小曦子 2009-01-07
  • 打赏
  • 举报
回复
还有个问题就是为何地址是从大到小呢???
小曦子 2009-01-07
  • 打赏
  • 举报
回复
那请问LH的C++执行一段完整程度的时候地址有没有按顺序的呀..中间不会出现缺段(排除中间使用地址加减问题或跳跃的.....)
hai040 2009-01-07
  • 打赏
  • 举报
回复
0x0013ff7c - 0x0013ff78 = 4
0x0013ff78 - 0x0013ff70 = 8
每相差1就相差sizeof(int)个字节
herman~~ 2009-01-07
  • 打赏
  • 举报
回复
mark
threeleafzerg007 2009-01-07
  • 打赏
  • 举报
回复
地址指针 + 1 + 2 都是 + 1*sizeof(int *) - 2 = - 2 * sizeof(int *)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧