| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6127 人关注过本帖
标题:printf("%p", p);输出的是指针的地址,那么这个值是偏移地址吗?
只看楼主 加入收藏
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
printf("%p", p);输出的是指针的地址,那么这个值是偏移地址吗?
假设printf输出的值是0028FEF8,如果这个值是偏移地址的话,那么偏移地址就是8*4=32位。如果还按照段地址加偏移地址来寻址的话,那么cpu的最大寻址能力就是2^33=16GB。可是我的cpu和操作系统都是64位的,CPU的最大寻址能力应该是2^64啊,怎么就不对了呢?

我觉得可能的答案有两个:
1.printf输出的不是偏移地址或者输出的不是偏移地址的全部位数
2.64位CPU不再按照段地址+偏移地址来寻址。
求大神解答!

程序代码:
int main(){
    int a[5] = {1, 2, 3, 4, 5};
    int *p = a;

    printf("%p", p);    //输出0028FEF8
    return 0;
}

搜索更多相关主题的帖子: 操作系统 能力 
2014-09-24 20:26
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:10 
简单说说:
操作系统都是64位的,这句话不假,但是真正实现64位的硬件很少,大多数厂商都使用了一部分的资源,尤其是寻址能力上,因为64位的寻址能力太大了,但是根据实际需要,厂商没有真正扩展到这么多,有的芯片或者系统只是简单扩充到了40位左右
2014-09-24 20:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
1.任何时候都是偏移地址。
2.不是系统和机器是64位,指针就是64位的,你编译的是32位程序,就用32位指针,编译器默认也是用32位指针。要使用64位指针,必须在程序中告诉编译器启用64位指针,具体视编译器而定。


[ 本帖最后由 TonyDeng 于 2014-9-24 20:45 编辑 ]

授人以渔,不授人以鱼。
2014-09-24 20:38
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
小伙最近深陷指针啊
2014-09-24 20:44
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:0 
回复 4 楼 书生等待
呵呵,指针就是个坑,我要把这坑里的鱼虾青蛙泥鳅黄鳝螺蛳蚌壳都捞的不剩一个再上来
2014-09-24 20:48
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
回复 5 楼 muyoucumian
嗯嗯,跟到你学习
2014-09-25 00:35
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
先学习语言 再学习实现和原理 挖的太深太费劲
2014-09-25 13:00
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
收藏
得分:0 
回复 3 楼 TonyDeng
我知道了,对32位CPU,物理地址=32位段地址 + 32位偏移地址。
2014-09-25 19:08
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用muyoucumian在2014-9-25 19:08:01的发言:

我知道了,对32位CPU,物理地址=32位段地址 + 32位偏移地址。

不对

逻辑地址 线性地址 物理地址 需要一层一层的转换

百度了一下 已经有人总结了 直接看就好了 省得看书了

http://blog.
2014-09-25 19:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用muyoucumian在2014-9-25 19:08:01的发言:

我知道了,对32位CPU,物理地址=32位段地址 + 32位偏移地址。

不是的。

授人以渔,不授人以鱼。
2014-09-25 20:19
快速回复:printf("%p", p);输出的是指针的地址,那么这个值是偏移地址吗? ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017588 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved