帕斯卡解释“指针类型”
11.1指针
11.2单链表
11.1指针
指针是一种通过地址访问变量的特殊数据类型,属于动态数据结构。需要的时候可以生成,用完后可以取消或者回收,减少占用内存空间。指针变量不同于其他类型的变量,因为它们占用的不是数据而是地址。
因为动态数据结构的变量是在程序执行的过程中动态生成的,不能预先解释,不能预先命名,访问时也不能直接输出或通过名字显示,只能用指针获取其地址,然后间接访问。
1,定义指针类型
在Turbo Pascal中,指针变量用于存储一个存储单元的地址,即指针变量指向一个存储单元。一个指针变量只能指向某一种类型的存储单元,这种数据类型是在指针类型的定义中确定的,称为指针类型的基类型。指针类型定义如下:
类型名=基类型名;
例如:键入q=^integer;
var a,b,c:q;
描述:Q是指向整数存储单元的指针类型,其中“”是指针。a、b、c都定义为指针变量,可以分别指向一个整数存储单元。
上述示例也可以用如下变量来解释:
var a,b,c:^integer;
指针也可以指向结构化存储单元。
例如:键入人员=记录
名称:string[10];
性别:(男,女);
年龄:20岁..70
结束;
var pt:^person;
Pt是记录类型person的指针变量。
2.动态变量
指针指向的动态存储单元,即动态变量,其形式如下:
指针变量名
例如:p,q,r
指针变量p和它所指向的动态变量p有如下关系:
以下语句将整数5存储在由p指向的动态变量p中:
p^:=5;
以下语句将p中由p指向的值赋给整数变量I:
i:=p^;
如果指针变量p不指向任何内存位置,可以使用下面的赋值语句:
p:= nil;
Nil是保留字,意思是“空”,相当于C语言中的null。
3、动态变量的操作
在Turob Pascal程序中,动态变量不能由var直接定义,而是通过调用标准过程new来建立。流程形式是:
New(指针变量名);
如果有下列变量定义语句:
var p:^integer;
只说明p是一个指向整数变量单元的指针变量,但是这个整数单元并不存在,指针变量p中也没有具体的地址值,在程序中必须调用语句:new(p);只有在内存中分配了一个整数变量单元,并且这个单元的地址放在变量P中,指针变量才能只存储一个地址。一个指针一次只能指向一个变量单元。当程序再次执行new(p)时,在内存中创建新的整数变量单元,并将新单元的地址存储在P中,这样就丢失了旧变量单元的地址。
为了节省内存空间,应该使用标准进程dispose释放一些不再使用的现有动态变量。进程形式为:dispose(指针变量名);new(指针变量名称)的逆过程用来释放指针变量所指向的动态变量的存储单元。比如使用new(p)后调用dispose(p)时,指针P指向的动态变量被撤销,内存空间返回给系统。此时,p的值为零。
4.需要注意什么
1,p和p的区别
p是指向动态变量的指针变量名,p称为动态变量或标志变量。p的值是p的第一个地址,p的值与基类型相同。
2.定义后及时分配存储单元。
在定义了指针变量之后,没有为指针分配动态存储单元。此时p的值是未定义的,调用p会导致运算错误。如果想让指针可用,可以给指针赋值,也可以通过NEW()进程分配存储单元。
3.使用后及时回收存储单元。
指针使用后,不会自动返回占用的存储空间。我们应该使用DISPOSE()过程及时释放P占用的存储单元,避免浪费有限的存储空间。
11.2单链表
单链表的数据类型可以定义如下:
键入dlb=^node;
节点=记录
数据:数据类型;
下一个:dlb
结束;
例1连续输入一系列整数组成链表(并动态记录)。当输入的数字是-1时,停止输入,然后输入的整数以相反的顺序输出。
程序联表;
键入link=^data;
数据=记录
num:整数;
下一个:链接;
结束;
var p,q:link;
I:整数;
开始
q:= nil;
readln(一);
而我& lt& gt-1 do
开始
新(p);
跟p^做什么
开始
num:= I;
接下来:= q;
结束;
q:= p;
readln(一);
结束;
而p & lt& gt没有
开始
write(p^.num:6);
p:=p^.next;
结束;
readln
结束。
练习:如果例子1中的数据不是按逆序(按输入的顺序)输出,如何建表?(程序)
其实上面的建表方法是分别从表头和表尾插入元素,下面是从表中插入元素;
例2:输入一些整数(输入32767停止输入)并排序(从小到大)输出。
程序联表;
键入link=^data;
数据=记录
num:整数;
下一个:链接;
结束;
var头,p,q,r:链接;
I:整数;
开始
head:= nil;
readln(一);
而我& lt& gt32767 do
开始
新(p);
p^.num:= I;
p^.下一个:= nil
如果head=nil,那么begin head:= p;结束
其他
开始
q:=头;
如果p^.num<;q^.num接着开个头:= p;p^.next:=q结束else
开始
而(p^.num & gt;=q^.num)和(q & lt& gtnil)do begin r:= q;q:=q^.next;结束;
如果q =,那么r^.next:=p开始r^.next:=p;p^.next:=q角
结束;
结束;
readln(一);
结束;
p:=头;
而p & lt& gt没有
开始
write(p^.num:6);
p:=p^.next;
结束;
readln
结束。