Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279294
  • 博文数量: 80
  • 博客积分: 2269
  • 博客等级: 大尉
  • 技术积分: 836
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-09 11:07
文章分类

全部博文(80)

文章存档

2016年(1)

2013年(8)

2012年(23)

2011年(21)

2010年(21)

2009年(6)

我的朋友

分类:

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,这在编译的时候就已经严格控制了,所以出现编译错误的时候就可以考虑这方面的问题。
阅读(3384) | 评论(0) | 转发(0) |
0

上一篇:VC常用小技巧

下一篇:Delphi中数组

给主人留下些什么吧!~~