分享

delphi函数指针 只有@@p才代表了函数指针本身的地址 ,assigned(p) 判断是否为空

 quasiceo 2014-06-20
delphi函数指针 2010-07-15 10:09:01

分类:

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,这在编译的时候就已经严格控制了,所以出现编译错误的时候就可以考虑这方面的问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多