当指针变量声明后没有使用@运算符赋值时,此时的指针变量称为动态指针变量,动态指针变量在访问之前必须首先分配内存单元。Object Pascal 提供了标准过程来处理:
New,用来为动态指针变量分配内存单元,并把该单元的地址赋值给指针变量,所分配的单元大小由指针所指向的类型决定。如果应用程序的堆栈已没有足够的空间,则触发EoutOfMemory异常。调用格式:
New(<指针变量名>)
如:
var
p: ^integer;
begin
New(p);
end;
此时就可以使用“p^”来访问这个整型的动态指针变量。
当程序不再使用动态指针变量时,可以调用标准过程 Dispose 删除 New 所创建的动态指针变量,并释放所分配的内存单元,调用格式:
Dispose(<指针变量名>)
如:
var
p: ^integer;
begin
New(p);
p^ := 7;
Dispose(p);
end;
8.2GetMem和FreeMem过程
标准过程 GetMem 用于为动态指针变量申请一块指定大小的内存区域,并把该区域的起始地址赋值给指针变量。如果应用程序的堆栈已没有足够的空间,则触发EoutOfMemory异常。调用格式:
GetMem(<指针变量名>, <区域大小>)
当程序不再使用动态指针变量时,可以调用标准过程 FreeMem删除动态指针变量,并释放所分配的内存单元,调用格式:
FreeMem(<指针变量名>)8.3动态指针变量的应用
动态指针类型,常用来描述动态存储结构的实现。如:链表、堆栈、队列等。本节简单介绍链表结构。
链表是一组元素的序列,在这个序列中,每个元素总是与前面的元素相链接,这种链接就可以使用指针来实现。如下图:
链表中的元素称为节点,第一个节点称为表头,最后一个节点称为表尾。
指向表头的指针称为头指针,存放表头的地址。表尾不指向任何节点,其指针的值为Nil。
节点一般使用记录类型来描述,描述节点的记录至少包含两个域:值域,存放数据的域,其类型由存储的数据类型决定;指针域,存放下一个节点的地址。
如:
type
Node = record
data: integer;
next: ^Node;
end;
var
head: ^Node;
或者:
type
link = ^Node;
Node = record
data: integer;
next: ^Node;
end;
var
Head: link;
注意:在上面的代码中,link = ^Node; 语句在定义时,Node还没有被定义,在Object Pascal中,这种情况只对指针类型的定义适用,也就是说:指针所指的对象可以被后定义。
8.4动态指针的使用示例:用链表实现随机产生10个整数,计算和、平均值、最大值、最小值。界面如下图:
示例代码:
type Pointer = ^Node; Node = record value: Integer; next: Pointer; end; var Head: Pointer; procedure TForm1.FormCreate(Sender: TObject); var p: Pointer; i: integer; begin // 窗体创建时对链表进行初始化 New(Head); p := Head; for i := 1 to 10 do begin New(p^.next); p := p^.next; end; p^.next := nil; end; procedure TForm1.FormDestroy(Sender: TObject); begin // 窗体销毁时对链表进行释放 Dispose(Head); end; procedure TForm1.Button1Click(Sender: TObject); var p: Pointer; begin // 链表中存放数据 Memo1.Lines.Clear; Edit1.Text := ''; Edit2.Text := ''; Edit3.Text := ''; Edit4.Text := ''; randomize(); p := Head; while p^.next <> nil do begin p^.value := random(100); p := p^.next; end; p := Head; while p^.next <> nil do begin Memo1.Lines.Add(inttostr(p^.value)); p := p^.next; end; end; procedure TForm1.Button2Click(Sender: TObject); var p: Pointer; sum, max, min: Integer; mean: Real; begin // 计算 p := Head; sum := 0; max := p^.value; min := p^.value; while p^.next <> nil do begin sum := sum + p^.value; if p^.value > max then max := p^.value; if p^.value < min then min := p^.value; p := p^.next; end; mean := sum / 10; Edit1.Text := inttostr(sum); Edit2.Text := floattostr(mean); Edit3.Text := inttostr(max); Edit4.Text := inttostr(min); end;



