温芯武 祖孙三代: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):
举例说明:
unit Unit1; interfaceuses 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 与 PIntegerprocedure TForm1.Button1Click(Sender: TObject);varint: Integer;pint: PInteger; {定义类型指针, Integer 类型的指针}beginint := 100;pint := @int; {现在 pint 就是 int 的指针}pint^ := pint^ + 1; {现在 pint^ 和 int 是一回事, 测试一下:}ShowMessage(IntToStr(int)); {101}ShowMessage(IntToStr(pint^)); {101}end;//直接定义类型指针procedure TForm1.Button2Click(Sender: TObject);varint: 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 的参数是传地址的;
指针就是一个地址, 尽管没有指定传地址, 但事实上就是给了一个地址,
所以参数值也会改变!
}