- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[第17课]指针与动态变量资料
指针与动态变量 引言 以前所讲的简单类型的数据或构造类型的数据都是静态数据,这些类型的变量一经定义,就在内存中占有固定的存储单元,直至程序结束。 指针类型的变量属于动态数据。是在程序执行时,根据程序的数据存储需要而扩充或缩减。 在PASCAL中,指针变量存放某个存储单元的地址,即指针变量指向某个存储单元。 指针类型说明的一般形式 Type 指针类型标识符=^类型标识符; 说明1:指针类型标识符由用户定义,必须符合标识符命名规则; 说明2:类型标识符:是除文件以外的任何数据类型。 例1:type point1=^integer; point2=^real; 解释:上例定义了两个指针类型,point1是整型指针类型,point2是实型指针类型。 指针类型变量的定义 说明了指针类型,就可以定义该类型的指针变量。 例var p1:point1;p2:point2; 类型说明可以与变量定义合并在一起。 例:var p1:^integer; p2:^real; 注意点:指针类型说明时,可以不遵循“先说明”后“使用”的原则。 例:point=^node; node=record num:integer; name:string; end; var stu:^point; 动态变量 静态变量中存放的是相应类型的数据,而指针变量中存放的是相应类型数据所在的存储单元的地址。要访问指针变量所指向的数据,必须使用动态变量。 动态变量不在变量说明中定义,在程序执行过程中建立。它没有标识符,而是用指针变量后跟符号^表示。如p^:=245; 指针变量本身是简单类型(静态数据),它所指向的数据可以构成动态数据 动态变量的建立 指针变量的值一般是通过系统分配的,建立一个动态变量(动态存储单元)必须调用标准过程NEW。 New过程调用的格式:new(指针变量); New过程的作用:建立动态变量;为动态变量分配一定的存储空间,用以存放动态变量;并将动态变量的存储空间的首地址存入指针变量中。 例:var p:^integer; 此时P的值为nil 执行语句:new(p); 此时P的值为一存储单元地址 p^:=245; 动态变量的撤消 释放动态变量使用标准过程dispose。 Dispose过程调用的格式:dispose(指针变量) Dispose过程的作用:释放指针所指向的存储单元,使指针变量的值为nil,不指向任何存储单元。 例:dispose(p); 动态变量的操作 动态变量的引用:指针变量^ 例:p^:=4; i:=p^; 对动态变量所能进行的操作是该类型(指针的基类型)所允许的全部操作。 例:var p:^integer; i:integer; New(p); i:=4: p^:=4; 指针变量的操作 可调用new、dispose过程。如new(p); dispose(p); 具有同一基类型的指针变量之间相互赋值。 例:var p1,p2,p3:^integer; New(p1); new(p2); new(p3); P1^:=5; p2:=P1; p3^:=p1^+P2^; 可以给指针变量赋nil值。Nil是pascal的关键字,它表示指针的值为“空”。 例:P1:=nil; 可以对指针变量进行比较运算。 例1:new(P1); write(p1=nil); 结果将输出FALSE 例2:new(p1); new(p2); write(p1=p2); false 指针的应用一 —— 链 表 结 构 简单链表结构示意图 每个框表示链表的一个元素,称为结点 框的顶部表示了该存储单元的地址(当然,这里的地址是假想的) 每个结点包含两个域:一个域存放整数,称为数据域,另一个域存放下一个结点(称为该结点的后继结点,相应地,该结点为后继结点的前趋结点)的地址,称为指针域 链表的第一个结点称为表头,最后一个结点称为表尾 指向表头的指针head称为头指针(当head为nil时,称为空链表),在这个指针变量中存放了表头的地址 在表尾结点中,指针域不指向任何结点,一般放入nil。 链表的基本结构 链表中的每个结点至少应该包含两个域:一是数据域,一是指针域,因此,每个结点都是一个记录类型。指针的基类型也正是这个记录类型。因此,head可以这样定义: type pointer=^ rec; rec=record data:integer;
文档评论(0)