免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fender0107401
打印 上一主题 下一主题

指针不应该只包含类型和地址,还包括指向的内存大小。  关闭 [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
61 [报告]
发表于 2010-10-09 15:28 |只看该作者
这贴总算回来了

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
62 [报告]
发表于 2010-10-09 15:28 |只看该作者
指针体现在汇编层次上也就是地址。
    然而这个地址是啥呢。如果说是字节的编号,从这个字节开 ...
狗气球 发表于 2010-10-09 15:17


看来我最开始的理解还是有问题的。

论坛徽章:
0
63 [报告]
发表于 2010-10-09 15:36 |只看该作者
回复 62# fender0107401

完全正确。
指针大小是固定的。比如32位机器上就是32位。只能保存一个地址而已。

MALLOC的内存可以如此组织:

NEXTP0 DATA0 ------------ NEXTP1 DATA1 ---- NEXTP2 DATA2 ------------------------- NEXTP3 DATA3 --------- NULL
如果这样,MALLOC返回给你的P是DATA0, DATA1等等。而大小可以从2块中的指针得到,或直接存储一个SIZEN.

原来的DOS就是这么组织的。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
64 [报告]
发表于 2010-10-09 15:39 |只看该作者
回复 65# 思一克


    哈哈。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
65 [报告]
发表于 2010-10-09 15:40 |只看该作者
回复  fender0107401

完全正确。
指针大小是固定的。比如32位机器上就是32位。只能保存一个地址而已。 ...
思一克 发表于 2010-10-09 15:36



    有一点值得细分。指针大小是地址总线的位宽。平台包括地址总线、数据总线和控制总线。如6502等8位机上的指针却是16位的,这是因为它们的地址总线是16位宽的。而数据总线却是8位的。

论坛徽章:
0
66 [报告]
发表于 2010-10-09 15:43 |只看该作者
有一点值得细分。指针大小是地址总线的位宽。平台包括地址总线、数据总线和控制总线。如6502等8位机上的指针却是16位的,这是因为它们的地址总线是16位宽的。而数据总线却是8位的。
--------
这完全可能。
指针可以比机器位数大,也可以比机器位数小。
在分段内存的的CPU上尤其如此。
原来的INTEL上的C,分为编译模式。硬件固定了,模式不同,指针也不同。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
67 [报告]
发表于 2010-10-09 15:48 |只看该作者
还有个问题比较有趣。8088的CPU是16位的吧。但是它的总线(数据、控制)却都是8位的。这也造成了一些编程上的趣事。主要是字节对齐优化。

论坛徽章:
0
68 [报告]
发表于 2010-10-09 15:52 |只看该作者
有一点值得细分。指针大小是地址总线的位宽。平台包括地址总线、数据总线和控制总线。如6502等8位 ...
cobras 发表于 2010-10-09 15:40


你这样说就太不对了

intel 机子上有 36 根地址线,那你就说它的指针是 36 位的?

指针的大小这是编程模型里的概念:

常见的有:
ILP32 模型是 32 位
LLP64 是 64 位

... ...

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
69 [报告]
发表于 2010-10-09 15:56 |只看该作者
如果想同时使用全部36位地址的内存的话,还非得36位指针不可。但这得CPU和编译器同时支持才行。

论坛徽章:
0
70 [报告]
发表于 2010-10-09 15:57 |只看该作者
还有个问题比较有趣。8088的CPU是16位的吧。但是它的总线(数据、控制)却都是8位的。这也造成了一些编程上 ...
cobras 发表于 2010-10-09 15:48



    又错了,8088 的是 20 位地址线
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP