- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
信息学奥赛培训教程(第14课) 指针(动态数据类型) 动态数据类型 使用静态数据类型的变量一经说明,就在内存中占有固定的存储单元,直到该程序结束; 而用新的数据类型──指针类型。通过指针变量,可以在程序的执行过程中动态地建立变量,动态地增加或删除变量。 链表结构 设有一批整数(12,56,45,86,77,……,),如何存放呢? 当然我们可以选择以前学过的数组类型。但是,在使用数组前必须确定数组元素的个数。如果把数组定义得大了,就会有大量空闲存储单元,定义得小了,又会在运行中发生下标越界的错误,这是静态存储分配的局限性。 利用指针类型可以构造一个简单而实用的动态存储分配结构――链表结构。 * 1)先定义后说明: type pointer=^Integer;var p1,p2:pointer; 定义了指针类型pointer,pointer为指向integer的指针 (一)指针类型和指针变量 说明了两个pointer类型的指针变量 **指针变量存放某个存储单元的地址 变量p1,p2存放指向integer的存储单元的地址 2)定义和说明合在一起 var a:^real; b:^boolean; type person=record name:string[20]; sex:(male,female); age:1..100 end;var pts:^person; a为指针变量,存放指向real的存储单元的地址 b为指针变量,存放指向boolean的存储单元的地址 指针变量pts存放指向存放记录类型person的存储单元的地址 integer,real,boolean,person 为指针类型的基类型 设有说明:var p:^Integer; (二)开辟和释放动态存储单元 开辟一个动态存储单元必须调用标准过程new new过程的调用的一般格式: New(指针变量) 功能:开辟一个存储单元,此单元能存放的数据类型是指针的基类型, 并把此存储单元的地址赋给指针变量。 ①定义了P是一个指示整型存储单元的指针变量,但这个单元尚未开辟, 或者说P中尚未有值。 ②当程序中执行了语句new(p)才给p赋值,即在内存中开辟(分配)一个 整型变量存储单元,并把此单元的地址放在变量p中。 (b)执行New(p)后生成新单元新单元的地址为XXXX 地址被赋值给p,新单元的值未定 (a)编译时给p分配空间 ?表示值未定 ③一个指针变量只能存放一个地址。如再一次执行New(p)语句,将在内存中 开辟另外一个新的整型变量存储单元,并把此新单元的地址放在p中,从而 丢失了原存储单元的地址。④当不再使用p当前所指的存储单元时,可以通过过程Dispose释放该存储单元 例如:dispose(p); ? XXXX ? p p^ (三)动态存储单元的引用 例1 设有下列说明: var p:^integer; i:integer; 画出执行下列操作后的内存示意图: New(p); P^:=4;i:=p^; 解: 如下图所示。 内存单元示意图 (a)编译时 (b)执行New语句 (c)执行P^:=4 (d)执行i:=P^ p为指针类型的变量:指针变量;存放地址; ^p为指针变量p所指向的内存变量,为整数类型;存放具体的值, 可以被当作整数类型使用; (四)对指针变量的操作 ⒈具有同一基类型的指针变量之间 相互赋值例2 设有下列说明与程序段: var p1,p2,p3:^integer; begin New(P1) ; New(P2); New(P3); P1:=P2; P2:=P3; end; 2、可以给指针变量赋nil值nil是PASCAL的关键字,表示指针 的值为“空“;例如, 执行:p1:=ni1后,p1的值是有定义 的,但p1不指向任何存储单元 ; 3、可以对指针变量进行相等或不相 等的比较运算;比较的结果为布尔值。 例3 输入两个整数,按从小到大输出来。 Type pointer=^integer; var p1,p2:pointer; procedure swap(var q1,q2:pointer); var q:pointer; begin q:=q1; q1:=q2; q2:=q; end; begin new(p1);new(p2); write(Input 2 data:);readln(p1^,p2^); if p1^p2^ then swap(p1,p2); writeln(Output 2 data:,p1^:4,p2^:4); end.
文档评论(0)