⒈指针类型的声明
指针类型的声明
指针类型在任何语言中都是比较难理解也是比较灵活的一种数据类型,指针通常是它所指的变量的内存地址。
声明指针类型的语法如下:
Type 指针类型标识符=^基类型;
程序示例如下:
Type
BytePtr=^Byte;
WordPtr=^Word;
上例中,声明了两个指针类型,一个是bytePtr,指向byte类型的数据,另一个是WordPtr,指向word类型的数据。
Object pascal不表示基类型一定要是在前面已声明的,也可以只是一个标识符,然后在同一个块内声明基类型。
声明了指针类型之后,就可以声明指针类型的变量,例如:
Var
BP:BytePtr;
WP:WordPtr;
为了简化程序,也可以把类型的声明和变量的声明合并在一起,例如:
Var BP:^Byte;
指针所指的基类型可以是简单类型,也可以是构造类型,例如:
Type Student=Record
name:String;
Age:Integer;
Sex : (Man, Woman);
End;
Var StuPtr:^Student;
上例中,声明了一个指向记录类型Student的指针变量Studptr,以后程序中就可以用StuPtr^来表示记录类
型的Student的动态变量,要访问其中的Name字段,可以写成StuPtr^.Name。
这里介绍动态变量的概念,动态变量是这样构成的,用指针类型的变量标识符后加一个^符号,就构成指针
所指向的基类型的动态变量,像上例中的StuPtr^就是Stduent的动态变量。
(在Delphi程序中,很多程序都习惯这样声明
Type PStudent=^TStudent;
TStudent=Record
name:string;
Age:Integer;
Sex : (Man, Woman);
End;
)
⒉指针的操作
实际上前面已介绍了指针的简单用法,这里还要介绍几个用于指针操作的过程和操作符。
New是object pascal中的标准例程(System 单元声明),用于在应用程序的堆中为动态变量分配一块区域,
并把该区域的地址赋给指针变量,所分配区域的大小由指针所指的类型决定。如果应用程序的堆上已没有足
够的空间,将触发EOutOfMemory异常。
New过程的声明如下:
Procedure New(var P:Pointer);
其中P是一个指针变量,调用了New过程之后,程序就可以用p^作为指针所指类型的动态变量。
相应地,用当程序不再需要使用动态变量时,就应当调用标准例程Dispose删除New创建的动态变量,并释放
所分配的空间。
程序示例如下:
Type
PListEntry=^TListEntry;
TListEntry=Record
Next:PListEntry;
Text:string;
count:Integer;
End;
Var
List,P:PlistEntry;
Begin
…
New(P);
P^.Next:=List;
p^.Text:='Hello World';
p^Count:=1;
List:=P;
Dispose(P);
…
End;
上例中,首先声明了一个指针类型PListEntry,指向TListEntry类型,TListEntry类型的声明在下面,是一
个记录类型。然后声明了两个PListEntry类型的变量List和P。
Object Pascal中还有一个例程GetMem,其作用与New差不多,也是在应用程序的堆中为动态变量分配一块区
域,并把该区域的地址赋给指针变量,不同的是GetMem例程指定了要分配区域的大小,GetMem的声明如下:
Procedure GetMem(Var P:Pointer;Size:Integer);
其中P是指针变量,Size是字节数。
相应地,用GetMem创建的动态变量必须用FreeMem例程删除,并释放分配的空间。
Object Pascal语言中还有一个@操作符,用于获得操作数的地址,操作数可以是变量、过程、函数或类类型
中的方法,关于@操作符的详细介绍请参考操作
符。
Object Pascal中有一个特殊的保留字nil,这是个空指针常量,当指针的值为nil时,表示指针当前没有指
向任何动态变量。注意:您不能用值为nil的指针变
量去访问动态变量。
指针变量除了能被赋值以外,还能进行相等或不相等的比较,比较只限于类型兼容的指针变量之间。当两个
指针指向同一个对象时(不是同一个类型)指针才
相等。
⒊无类型指针
无类型的指针是指指针变量声明时没有有确地给出基类型,无类型的指针是这样声明的:
Var Ptr:Pointer;
无类型指针的作用在于它可以指向任何类型,不过对于无类型的指针,您不能用类似ptr^的形式来引用它的
动态变量。
指针类型的声明
指针类型在任何语言中都是比较难理解也是比较灵活的一种数据类型,指针通常是它所指的变量的内存地址。
声明指针类型的语法如下:
Type 指针类型标识符=^基类型;
程序示例如下:
Type
BytePtr=^Byte;
WordPtr=^Word;
上例中,声明了两个指针类型,一个是bytePtr,指向byte类型的数据,另一个是WordPtr,指向word类型的数据。
Object pascal不表示基类型一定要是在前面已声明的,也可以只是一个标识符,然后在同一个块内声明基类型。
声明了指针类型之后,就可以声明指针类型的变量,例如:
Var
BP:BytePtr;
WP:WordPtr;
为了简化程序,也可以把类型的声明和变量的声明合并在一起,例如:
Var BP:^Byte;
指针所指的基类型可以是简单类型,也可以是构造类型,例如:
Type Student=Record
name:String;
Age:Integer;
Sex : (Man, Woman);
End;
Var StuPtr:^Student;
上例中,声明了一个指向记录类型Student的指针变量Studptr,以后程序中就可以用StuPtr^来表示记录类
型的Student的动态变量,要访问其中的Name字段,可以写成StuPtr^.Name。
这里介绍动态变量的概念,动态变量是这样构成的,用指针类型的变量标识符后加一个^符号,就构成指针
所指向的基类型的动态变量,像上例中的StuPtr^就是Stduent的动态变量。
(在Delphi程序中,很多程序都习惯这样声明
Type PStudent=^TStudent;
TStudent=Record
name:string;
Age:Integer;
Sex : (Man, Woman);
End;
)
⒉指针的操作
实际上前面已介绍了指针的简单用法,这里还要介绍几个用于指针操作的过程和操作符。
New是object pascal中的标准例程(System 单元声明),用于在应用程序的堆中为动态变量分配一块区域,
并把该区域的地址赋给指针变量,所分配区域的大小由指针所指的类型决定。如果应用程序的堆上已没有足
够的空间,将触发EOutOfMemory异常。
New过程的声明如下:
Procedure New(var P:Pointer);
其中P是一个指针变量,调用了New过程之后,程序就可以用p^作为指针所指类型的动态变量。
相应地,用当程序不再需要使用动态变量时,就应当调用标准例程Dispose删除New创建的动态变量,并释放
所分配的空间。
程序示例如下:
Type
PListEntry=^TListEntry;
TListEntry=Record
Next:PListEntry;
Text:string;
count:Integer;
End;
Var
List,P:PlistEntry;
Begin
…
New(P);
P^.Next:=List;
p^.Text:='Hello World';
p^Count:=1;
List:=P;
Dispose(P);
…
End;
上例中,首先声明了一个指针类型PListEntry,指向TListEntry类型,TListEntry类型的声明在下面,是一
个记录类型。然后声明了两个PListEntry类型的变量List和P。
Object Pascal中还有一个例程GetMem,其作用与New差不多,也是在应用程序的堆中为动态变量分配一块区
域,并把该区域的地址赋给指针变量,不同的是GetMem例程指定了要分配区域的大小,GetMem的声明如下:
Procedure GetMem(Var P:Pointer;Size:Integer);
其中P是指针变量,Size是字节数。
相应地,用GetMem创建的动态变量必须用FreeMem例程删除,并释放分配的空间。
Object Pascal语言中还有一个@操作符,用于获得操作数的地址,操作数可以是变量、过程、函数或类类型
中的方法,关于@操作符的详细介绍请参考操作
符。
Object Pascal中有一个特殊的保留字nil,这是个空指针常量,当指针的值为nil时,表示指针当前没有指
向任何动态变量。注意:您不能用值为nil的指针变
量去访问动态变量。
指针变量除了能被赋值以外,还能进行相等或不相等的比较,比较只限于类型兼容的指针变量之间。当两个
指针指向同一个对象时(不是同一个类型)指针才
相等。
⒊无类型指针
无类型的指针是指指针变量声明时没有有确地给出基类型,无类型的指针是这样声明的:
Var Ptr:Pointer;
无类型指针的作用在于它可以指向任何类型,不过对于无类型的指针,您不能用类似ptr^的形式来引用它的
动态变量。