看一个指针用法的例子: 1 var 2 X, Y: Integer; // X and Y 整数类型 3 P: ^Integer; // P 指向整数类型的指针 4 begin 5 X :=17; // 给 X 赋值 6 P := @X; // 把 x的地址赋给p 7 Y := P^; // 取出p所指向的数值赋给y 8 end;
F: function(X: Integer): Integer; I: Integer; function SomeFunction(X: Integer): Integer; ... F := SomeFunction; // 给f赋值 I := F(4); // 调用所指向的函数
在赋值语句中,左边变量的类型决定了右边的过程或者方法指针解释。
var
F, G: function: Integer; I: Integer; function SomeFunction: Integer; ... F := SomeFunction; // 给f赋值 G := F; // 把F的值拷贝给G I := G; // 调用函数
第一句获得函数的入口,第二句将指针复制,第三句获得函数的返回值。
有时候还可以这样使用 if F = MyFunction then ...; 在这里,F的出现导致一个函数调用;编译器调用F指向的函数,然后调用Myfunction,比较结果。这个规则是无论何时一个过程变量( procedural variable)出现在一个表达式中,它表示调用所指向的函数或者过程。有时F指向一个过程(没有返回值),或者f指向一个需要参数的函数,则前面的语句会产生一个编译错误。要比较F和Myfunction需要用 if @F = @MyFunction then ...; @F把F转换成一个包含地址的无类型的指针变量,@myfunction返回myfunction的地址。 获得一个过程变量的内存地址使用@@。例如,@@F返回F的地址。
@操作符通常把一个无类型的指针值赋给一个过程变量,例如: var StrComp: function(Str1, Str2: PChar): Integer; ... @StrComp := GetProcAddress(KernelHandle, 'lstrcmpi'); 调用GetProcAddres函数,用strcomp指向这个值 任何过程变量可以赋成nil,表示指证什么也不指向。但是试图调用一个nil值的过程变量导致一个错误,为了测试一个过程变量是否可以赋值,用标准的赋值函数Assigned if Assigned(OnClick) then OnClick(X);