帕斯卡解释“指针类型”

第11章指针类型

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

结束。