§9 指 针 类 型
前面介绍的数据均属于静态数据类型,在Pascal语言中,提供了动态的数据类型——指针。这里的静态和动态是指程序在编译时内存的分配,静态数据在说明时,内存就为它开辟了一个空间;而动态数据类型是在使用时,边申请边开辟内存空间,而且可以回收。 指针类型能处理较复杂的数据结构,能更好地利用内存,常用于描述链表、树、图等数据结构。
§9.1 指针类型的定义
指针不是一种标准类型,也就是说,在使用指针时,我们必须自己定义指针类型。 指针类型的一般形式如下:
TYPE <指针类型标识符> = ^ <结点类型标识符> ; <结点类型标识符> = RECORD
<数据域标识符1> : <类型> ; ……
<指针域标识符> : <指针类型标识符> ; END ;
【例1】 TYPE pointer = ^ node; { 指针类型point就是一根指针指向一个结点node}
node = RECORD { 而结点node是一个记录 } data1 : integer;
data2 : char; {数据域}
link : pointer; {指针域 又是指针类型point } END; 对应的结构如图9-1所示:
图9-1
指针结构的定义是一种递归定义,在 pointer = ^ node中,node未曾定义过,是先使用后定义;而在其后node的定义中,又出现了pointer类型,这是递归定义。仅在指针类型定义中允许出现这种先使用后定义情况。
§9.2 指针变量的说明
前面仅是指针类型的定义,指针变量同样需要进行变量说明。 指针变量说明的一般形式如下:
var <指针变量标识符1>:<指针类型标识符>; 例如: var p , q : pointer;
这很类似其他变量的说明,但指针变量说明与其它变量说明在实质上是有区别的,其他变量一旦说明,程序就会在内存开辟一个属于该变量的内存空间,而指针变量的说明没有开辟空间,只是说明了p、q标识符是一种指针类型。
§9.3 指针变量的使用
1.新建指针(申请空间)
一般形式为: new ( 指针变量);
p 例: new(p);
这表示在内存开辟一个结点空间,并将指针p指向该空间。 ..2.指针数据域赋值
一般形式为: <指针变量> ^ . <数据域标识符> : = <数据域的值>;
p 例: p ^ . data1 := 5; p ^ . data2 := ‘a’; 5 a 3.指针赋值
一般形式为: <指针变量> : = <指针变量>;
<指针变量> ^ . <指针域标识符> : = <指针变量>;
p q 例: q:=p; {表示将q指针指向p指针所指的空间} new(p); {申请新空间,并将p指针指向该结点}
q q^.link:=p; { q的指针域指向p所指结点} 注意:指针赋值并非指针结点的赋值,而是改变指针的指向。 4.回收空间
一般形式为: dispose (<指针变量>);
例: dispose(p); {表示回收p指针所指的空间}
* 指针部分将在《数据结构》链表中详述。
p