第九章指针类型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);