delphi中的函数指针实际上就是指针,只是在使用的时候有些不同。
函数指针要先定义一个函数类型。
type
TTestProc=procedure of object;
这是一个最简单的函数类型,没有参数也没有返回值,并且要求是类的成员函数。
类的成员函数其实就代表了调用的时候参数的不同,因为类的成员函数隐含着传入一个对象参数,而并不显式写明,函数都是静态的。当然了如果有重载就变成了虚函数指针表,其中的调用就复杂一点。
函数类型可以定义一个函数指针变量。
var
p:TTestProc;
这个指针变量是4字节的Pointer,可以与Pointer直接做转换,但是要加一个@,比如:
p1:=@p;
@p:=p1;
这里的p1是一个Pointer型。
当p被赋值成一个真正的函数之后,就可以使用了,如下:
p();
如果有参数则可以直接加上参数,与普通函数调用方法没有什么区别,如果需要取得函数指针本身的地址就需要:
@@p。
加一个@其实就是为了防止岐义,因为p本身也可以当成函数来使用,所以用@p来代表指针,不过特殊情况下p也可以代表一个指针,比如:
assigned(p);
这时候没有岐义,所以不需要加上@。
基本上p和@p都代表了函数指针,只有@@p才代表了函数指针本身的地址,为了不产生岐义,所以有时候使用@p,有时候使用p。一般在赋值的时候既可以使用p又可以使用@p,而在比较的时候必须使用@p,这在编译的时候就已经严格控制了,所以出现编译错误的时候就可以考虑这方面的问题。
阅读(3453) | 评论(0) | 转发(0) |