第九章指针类型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

9.1 指针类型的声明

指针类型在任何语言中都是比较难以理解也是比较灵活的一种数

据类型

指针常是它所指的变量的内存地址。声明指针类型的语法如下:

Type

〈指针类型标志符〉=^〈基类型〉;

其中,指针类型标志符即是指针类型名,基类型可以是简单类

型,如整型,实型,字符型等,也可以是结构类型,如数组,记

录,集合等。

指针类型声明示例:

Type

Tr = ^Integer;

PI = ^real;

Word = Record

Name: String[10];

Age: Integer;

Scores: Real;

End;

BytePtr = ^Byte;

WordPtr = ^Word;

上例中,声明了4个指针类型。其中,BytePtr是一个指向字节类型的数据;而WordPtr是一个指向记录类型Word的数据Object Pascal不要求基类型一定是要在前面已声明的,也可以是一个标志符,然后在同一个模块内声明基类型。

声明了指针类型后,就可以声明指针类型的变量,如:

Var

BP: BytePtr;

WP: WordPtr;

或:

Var

BP: ^Bytel;

指针所指的基类型可以是简单类型,也可以是构造类型,如:Type

Student = Record

Name: String;

Age: Integer;

Sex: (Man, Woman);

End;

Var

StuPtr: ^Student;

上例中,声明了一个指向记录类型的Student指针变量StuPtr,以后程序中就可以使用StuPtr^来表示记录类型Student的动态变量。要访问其中的Name字段,可以写成StuPtr^.Name。这里介绍动态变量的概念,动态变量的构成是用指针类型的变量标志符后加一个“^”符号,就构成指针所指向的基类型的动态变量,如上例中的StuPtr^就是Student的动态变量。

与通常的变量一样,一旦声明了指针变量,编译器将给指针分配存储单元,但存储单元中的值尚未确定。要想让指针指向确定的地址,必须通过赋值语句或New标准过程来实现。如:Label 1,2,3,4,5;

Var

M: Integer;

X1, X2: ^Integer;

Begin

1: M:= 20;

2: X1:= @M;

3: New(X2);

4: X2^:= 150;

5: Dispose(X2);

End;

执行上述语句段时,若编译器给变量M分配的内存地址为$,那么,执行标号为3的语句后,指针变量X1和变量M的关系如下:

X1 $

$20

即指针变量X1的值为变量M的内存地址。

执行语句3时,编译器首先在内存中分配适宜存放指针X2所指向的数据(这里为正数)的一组存储单元(假设为$01100A),然后将这组单元的首地址写入指针X2。这里X2^称为动态存储变量。使用New建立了动态存储变量后,它的值是不确定的,以后可以将某个整数值存储在该单元中。

X2 $01100A

$01100A?

X2 $01100A

$01100A150

执行语句5后,标准过程Dispose将释放由New分配的内存单元。在程序段中,标号过程New和Dispose应配对使用。当用New分配的动态存储空间不再使用时,应及时地释放所分配的存储空间,避免发生错误。如果

分配存储空间时内存不够,将触发一个异常错误(EoutOfMemory),程序随

即终止。上例中的运算符“@”和“^”专用于指针类型,分别称为取址和应用

运算符。

9.2 指针的运算

Delphi提供了专门的过程和函数来操作指针,

这些过程和函数是:

New过程,

@操作符,

PTR函数,

GetMem过程

1)New过程

New是Object Pascal中的标准例程(在System单元中声明),用于在应用程序中为动态变量分配一块区域,并把该区域的地址赋给指针变量。所分配区域的大小由指针所指的类型决定。如果分配存储空间时内存不够,将触发一个异常错误(EoutOfMemory)

New过程的声明如下:

Procedure New(Var P: Pointer);

其中P是一个指针变量,调用了New过程后,程序就可以用P^作为指针所指类型的动态变量。相应地,当程序不再需要使用动态变量时,就应当调用标准例程Dispose删除New创建的动态变量,并释放所分配的空间。程序示例如下:

Type

PlisEntry =^ TlistEntry;

TlistEntry = Record

Next : PlistEntry;

Text : String;

Count: Integer;

End;

Var

List, P: PlistEntry;

Begin

……

New(P);

P^.Next := List;

P^.Text := ’Hellow world’;

P^.Count := 1;

List:= P;

Dispose(P);

……

End;

2)@操作符

@操作符是一个一元操作符,用于获得操作数的的地址,@后面的操作数可以是变量,过程,函数或类型中的方法,程序示例如下:

Procedure ChangeValue(X: Integer);

Var

IntPtr: ^Integer;

Begin

Intptr:= @X;

Writeln(IntPtr^);

IntPtr^:= 20;

End;

如果主程序如下:

Var

Param: Integer;

Begin

Param:= 10;

ChangeValue(Param);

相关文档
最新文档