温芯武 祖孙三代:Delphi指针基本知识

来源:百度文库 编辑:中财网 时间:2024/04/26 06:10:44

Delphi指针基本知识

2010-04-16 17:30:37

Delphi 的指针分为 "类型指针" 和 "无类型指针" 两类.
Delphi 中的类型, 常用的也得有几百个, 我们可以给每种类型定义相应的类型指针.
其实 Delphi 已经为很多类型预定义了指针, 譬如数据类型:
Integer 有对应的 PInteger;
Char 有对应的 PChar;
string 有对应的 PString;
再譬如:
TPoint 有对应的 PPoint;
TColor 有对应的 PColor 等等.

另外, 指针也可以有指针, 譬如: PChar 是字符指针, PPChar 又是 PChar 的指针(这都是 Delphi 预定义的).

根据上面的例子, 咱们先总结一下类型与指针的命名规则:
类型约定用 T 打头(Delphi 常规的数据类型除外, 譬如: String);
指针约定用 P 打头;
指针的指针约定用 PP 打头.
类型和指针是不可分的两个概念, 指针本身也是一种类型 - "指针类型".


先认识一下指针相关的操作符(@、^、Addr): @ @变量 获取变量指针 Addr Addr(变量) ^ 指针^ 获取指针指向的实际数据 var Pxxx: ^类型 定义 Pxxx 某种类型的指针的变量  type Pxxx = ^类型  定义 Pxxx 为某种类型的指针

举例说明:


unit Unit1; interface 
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) 
Button1: TButton; 
Button2: TButton; 
Button3: TButton; 
Button4: TButton; 
procedure Button1Click(Sender: TObject); 
procedure Button2Click(Sender: TObject); 
procedure Button3Click(Sender: TObject); 
procedure Button4Click(Sender: TObject); 
end; 
var Form1: TForm1; 
implementation 
{$R *.dfm} 
//Integer 与 PInteger 
procedure TForm1.Button1Click(Sender: TObject); 
var 
int: Integer; 
pint: PInteger; {定义类型指针, Integer 类型的指针} 
begin 
int := 100; 
pint := @int; {现在 pint 就是 int 的指针} 
pint^ := pint^ + 1; {现在 pint^ 和 int 是一回事, 测试一下:} 
ShowMessage(IntToStr(int)); {101} 
ShowMessage(IntToStr(pint^)); {101} 
end; 
//直接定义类型指针 
procedure TForm1.Button2Click(Sender: TObject); 
var 
int: Integer; 
PMyInt: ^Integer; 
begin int := 100; 
PMyInt := Addr(int); {这句和: PMyInt := @int; 相同} 
PMyInt^ := PMyInt^ + 1; 
ShowMessage(IntToStr(int)); {101} 
ShowMessage(IntToStr(PMyInt^)); {101} 
end; 
//先自定义指针类型 
procedure TForm1.Button3Click(Sender: TObject); 
type PInt = ^Integer; 
var int: Integer;
 PMyInt: PInt; 
begin int := 100; 
PMyInt := @int; 
PMyInt^ := PMyInt^ + 1; 
ShowMessage(IntToStr(int)); {101} 
ShowMessage(IntToStr(PMyInt^)); {101} 
end; //指针的指针 
procedure TForm1.Button4Click(Sender: TObject); 
var int: Integer; 
pint: PInteger; 
ppint: ^PInteger;
 begin int := 100; 
pint := @int; 
ppint := @pint; 
ppint^^ := ppint^^ + 1; 
ShowMessage(IntToStr(int)); {101} 
ShowMessage(IntToStr(pint^)); {101} 
ShowMessage(IntToStr(ppint^^)); {101} 
end; 
end. 

知道以上这些就可以操作了, 就可以看懂别人的代码了; 不过要想彻底明白指针到底是怎么回事, 需要从内存谈起.


 {现在这个函数并没有 var 前缀, 也就是说参数应该不会被修改的} 
function MyFun(p: PInteger): Integer; {PInteger 是 Integer 的指针类型}
begin
  p^ := p^ * 2;
  Result := p^;
end;
{测试}
procedure TForm1.Button1Click(Sender: TObject);
var
  i,x: Integer;
begin
  i := 8;
  x := MyFun(@i);           {调用函数}
  ShowMessage(IntToStr(x)); {16}

  {现在 i 的值应该不会被修改, 但...}
  ShowMessage(IntToStr(i)); {16}
{
  没有 var 或 out 前缀的参数, 应该是传值的;
  有 var 或 out 的参数是传地址的;  
  指针就是一个地址, 尽管没有指定传地址, 但事实上就是给了一个地址,
  所以参数值也会改变!
}