免费注册 查看新帖 |

Chinaunix

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

也谈指针,指向内存大小,指针的大小... [复制链接]

论坛徽章:
0
31 [报告]
发表于 2010-10-17 09:25 |只看该作者
本帖最后由 iLRainyday 于 2010-10-17 09:31 编辑
我绝对不会说“地址是指针”,只可能说指针的值是地址

pointer和address是两个概念。pointer是某个object的reference,属于一个high-level的概念,而address是一个low-level概念,表示内存单元的位置。只不过在c语言里,pointer是通过address的方式来实现对于object的reference的。

pointer常常通过address实现,但并不是总这样。在一些企图扑捉dangling reference的语言中,一个pointer可能包含了一个地址和一个access key.

这两个概念在《programming language pragmatics》中,作者scott做过区分。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
32 [报告]
发表于 2010-10-17 09:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
33 [报告]
发表于 2010-10-17 11:20 |只看该作者
同意。我认为在C语言中  pointer = address + type
    谢谢你提到的书,我去找找


C语言中,pointer就是通过address实现的吧。pointer肯定有对应的type,不过type的信息显然没有存储在pointer中。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
34 [报告]
发表于 2010-10-17 19:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
35 [报告]
发表于 2010-10-18 15:51 |只看该作者
嗯,一般说来很少有一定的事,那也麻烦回复时看清别人有没有说一定
另外,您这两句话说了等于没说, ...
lemoncookie 发表于 2010-10-14 22:16



    你可以举例子,那么应该说举例而言。
    不说举例而言就不合适。

    实现指针时是否一定要用4个字节的地址。以及系统地址总线字长是否四个字节。这是不一定的。
    至于指针指向啥地方,当然不一定是堆了。指向栈的、指向静态数据区的也很常见。你可以只字不提,但你没有说你那只是举个例子,那我只好跟你说,不一定了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
36 [报告]
发表于 2010-10-18 16:03 |只看该作者
回复 31# iLRainyday

请教一下, programming language pragmatics这本书, 是讲C语言的么?
书中的pointer是泛指?

感觉不是指的C语言中的pointer吧?

论坛徽章:
0
37 [报告]
发表于 2010-10-18 19:08 |只看该作者
TC上的指针  与 GCC 上的指针是不同地。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
38 [报告]
发表于 2010-10-19 07:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
39 [报告]
发表于 2010-10-19 09:22 |只看该作者
请问差别在何处
pmerofc 发表于 2010-10-19 07:38


TC是16位程序,生成代码也是16位代码。有6中模式tiny,small,medium,compact, larger,huge,3种地址关键字far、near、huge。
以下是抄来的。

      在tiny、small模式下,所有的函数定义、全局变量定义和指针变量的定义,如果没有显示的加上far、near、huge等关键字,都默认为使用了near关键字;
      在medium模式下,函数定义默认使用了far关键字,变量定义默认使用了near关键字;
      在compact模式下函数定义模式使用了near关键字,变量定义默认使用了far关键字;
      在large模式下函数定义和变量定义模认使用了far关键字;
      在huge模式下函数定义模认使用了far关键字,变量定义默认使用了huge关键字。

      near、far、huge关键字的真正含义是什么?这三个关键字只能用于修饰函数、全局变量和指针变量,对于非指针类型的局部变量,这些关键字没有实际意义。
      当这三个关键字用于修饰函数时,huge的含义与far相同,用于指明该函数的调用方式为far调用方式,即调用时需要一个段值和一个段偏移组成的32bits调用地址,使用far

call进行跳转,跳转前先压栈保存当前CS:IP。near修饰函数时,用于指明该函数的调用方式为near调用方式,调用时先压栈保存当前IP,需要一个16bits的近地址,即当前CS的段

内偏移。

      当这三个关键字用于修饰指针时,near型指针实质上为16bits的无符号整型数,该整数给出了所指向变量在当前数据段内的偏移地址,也就是说,在使用near型指针寻址时

实际上是进行如下的寻址操作:[DS:指针变量值]。对于far型的指针变量,可以寻址1MB地址空间的任意一个地方,far型指针的实质是一个32bits的整型数,高16bits为段值,低

16bits为段内偏移,Turbo C中在使用far型指针时,会先将高16bits放入ES寄存器中,然后再进行如下的寻址操作:[ES:指针变量低16bits值]。对于hug型的指针变量,与far型指

针变量的不同之处在于,在对far型指针变量进行+/++/-/--等操作时,far型指针变量保持段值不变(也就是高16bits),而只对段内偏移进行加减操作,所以会出现段内回绕的现

象,而huge型的指针,在进行加减操作时将会自动的改变段值,不会出现段内回绕。所以给人的感觉就是huge指针能比far指针寻址更大的内存空间。

      对于局部变量,由于是创建在堆栈上,所以near、far等关键字将不具备任何意义,因为创建在堆栈上的变量的寻址方式就只有一种,即使用sp和bp维护函数堆栈,利用

bp+/-一个偏移来寻址函数参数变量和局部变量。这样的寻址方式是固定而唯一的,near和far等关键字都派不上用场,这里的near和far将没有任何的实际含义。

      对于使用near、far和huge修饰的全局变量的含义也很容易理解了。near型的全局变量,被分配到了当前的数据段上,寻址这个变量只需要一个16bits的偏移量,而far型全

局变量在寻址时,需要给出段值和偏移量。huge型数组可以使用大于64K的内存空间。

      far、near、huge型指针变量之间的相互转换,从小尺寸的指针到大尺寸的指针将进行自动的类型转换,转换方式为加上当前的DS形成32bits的指针。从大尺寸的指针到小尺

寸的指针需要进行强制类型转换,转换的结果为只保留低16bits,但是这样俄转换没有实际的意义或者说用处不大,并且极其容易引入内存访问的错误,所以要严格避免使用。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
40 [报告]
发表于 2010-10-19 09:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP