北航程序设计语言原理教材第04节-note.doc

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 第 PAGE 64页 第4章 存 储 如前所述,程序世界、机器世界是同一事物的不同层次描述。在每个层次上各有自己的术语概念。我们的目标虽然是为程序世界提供表达程序的术语和语言,因为它们密切相关。我们也应该了解机器世界里存储对象有哪些,怎样工作,可以实现哪些机制。这些工作机制反映到程序世界是什么? 在某种意义上说,越能在上层构造出更新、更多的符合软件工程原理的程序对象,越要在下层想出更多的实现办法,如果都能实现,则程序设计语言就进了一步。 有关存储对象的基本术语和机制,我们假定读者已在汇编语言课程学过,此处不重复, 只是在涉及到机器世界术语和机制时我们才提到它。请注意,我们讨论问题的立场是程序世界。还要注意到,程序对象和存储对象并非一一对应的,赋初值的简单常数一般也是不作为独立的存储对象, 直接放在被赋值的变量中。所以研究存储对象的核心是抓住“变量”。 本章主要讨论变量的时空特性,第二节介绍各种实现计算的存贮模型,第三节讨论因时空关系而出现的悬挂指升问题,第四节讨论各种语言变量更新机制,第五节介绍有副作用的表达式。 4.1 程序变量的时、空特性 如前所述,程序世界中的变量不同于数学变量在于它的时、空特性。我们先从空间特性开始。我们知道,计算机内的变量的存储空间是随时可变的,它可以在外存磁盘上,也可以在内存的某个地方,而且同一程序两次加载运行变量也不会在一个地方,即非固定地址。为此, 一般目标程序中都采用相对地址的办法,绝对地址就不重要了。对于程序,我们要找到某个计算对象,永远从该段程序的首地址开始。为了简化,我们在虚存空间讨论存储对象。 4.1.1 引用和指针 由于变量的名值分离,当程序操纵变量时,首先寻址再取内容。这是两种操作取地址(引用)和取值(递引用)。命令式语言两者都要,且有时是隐式的。自从Pascal,C引入指针变量可显式操纵变量的地址,给程序员带来极大方便。例如,一个大单位,随机录用上千个员工。每个员工履历是一复杂记录,现登记现录入无序存放。我们只要按它的某个属性特征对指向它们的首地址(指针)排序,即可按排好序的指针表次序打印各种报告,而无需将庞大的记录重排多次。 指针本身也是程序对象,它也有地址,于是C语言允许多级指针的机制。其它语言编译只允许一级指针,除非指向复杂数据结构内嵌的指针。用↑(Pascal)和*(C)标记指针变量标识符以识别是操纵指针变量的内容(地址),还是操纵指针变量所指对象的内容(值)。 例4-1,C程序中的指针 int i; int * p, *q; : *p=i; //p指向整变量i p=i; //错误, p中只放地址值 p=i; //正确, 效果同*p=i,取地址符 q=p; //正确, 同类型赋值,q,p都指向i *q=*p+1; //q指向i, 此时i已成为i+1 q=p+1; //1仅是名,值取决于所指对象每个单元占多少字节。 所谓寻址即要给出编译(或解释)时程序变量名与地址的对照表。每当给程序对象分配存储时就在表中填入,这样就创建了引用(reference)。由于程序对象名字编译后不存在,每次操纵用的是地址,这个在对照表中有的地址即为该对象的别名。早期语言认为这是属于‘内部’的事,外叫‘变量’,内叫‘地址码’。而C++语言把这个占据存储的存储对象也上升为程序对象,叫做引用,使用户直接操纵地址。引用,指针、变量关系的示意图如图4-1。 312(RA) 引用 A 136 (P1) (P2) 指针 316(RB) B 140 448 450 320(RC) 136 144 C 144 500 136 140

文档评论(0)

189****6140 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档