delphi函数指针 只有@@p才代表了函数指针本身的地址  

  assigned(p) 判断是否为空

  或者用 @p=nil 来判断函数指针是不是为空

  Delphi中的函数指针实际上就是指针,只是在使用的时候有些不同

  函数指针要先定义一个函数类型,比如

type
TTestProc = procedure of object;

  这是一个最简单的函数类型,没有参数,也没有返回值,并且要求是类的成员函数

  类的成员函数其实就代表了调用的时候参数的不同,因为类的成员函数隐含着一个对象参数,而不是显式写明,函数都是静态的。

  当然了,如果有重载就变成了虚函数指针表,其中的调用就复杂一些

  函数类型可以定义一个函数指针变量

var
p: TTestProc;

  这个指针变量是4自己的 Pointer。可以与 Pointer直接做转换,但是要加上一个 @,比如:

var
p: TTestProc;
p1: Poniter;
begin
p1:= @p;
@p:= p1;
end;

  这里的 p1 是一个 Pointer类型

  当 p 被赋值成一个真正的函数之后,就可以使用了,如下

p();

  如果有参数可以直接加上参数,与普通的函数调用方法没有什么区别,如果需要取得函数指针本身的地址就需要

@@p;

  加一个 @ 其实就是为了防止歧义,因为 p 本身也可以当成函数来使用,所以用 @p 来代表指针,不过特殊情况下p 也可以代表一个指针,比如

Assigned(p);

  这时候没有歧义,所以不需要加上 @,当然也可以使用

Assigned(@p);

  其实 assigned() 函数的参数要求是一个指针变量,用来判断这个指针是不是为 nil,如果是则返回 False,如果不是则返回 True

  

总结:

  p和 @p 都代表函数指针,只有@@p 才代表函数指针本身的地址,为了不产生歧义,所以有的时候需要使用 @p,有时候使用 p(比如 assigned(p))

  一般在赋值的时候既可以使用 p 又可以使用 @p,而在比较的时候,必须使用 @p,这在编译的时候就已经严格控制了,所以出现编译错误的时候就可以考虑这方面的问题

Delphi中的函数指针判断是否为空的更多相关文章

  1. delphi 中的函数指针 回调函数(传递函数指针,以及它需要的函数参数)

    以下代码仅仅是测试代码:delphi XE7 UP1 interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.V ...

  2. delphi中一切皆指针

    unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...

  3. Delphi中 StrToIntDef函数的用法

    Delphi中 StrToIntDef函数的用法:比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strtoi ...

  4. QT中使用函数指针

    想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...

  5. C++中使用函数指针 【瓦特芯笔记】

         在C++类中使用函数指针. 类型定义:      typedef 返回类型(类名::*新类型)(参数表) //类定义 class CA { public: char lcFun(int a) ...

  6. 1、C语言中的函数指针

    一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...

  7. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  8. Keil C51 中的函数指针和再入函数

    函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递. ...

  9. C++中的函数指针和指针函数

    C++中的函数指针和指针函数       数组名一般可以被当成指向数组第一个元素的常量指针,同样的情况,在函数中,函数名可以本当成指向函数的常量指针,假如一个函数已经定义,那么它在计算机中一定有特定的 ...

随机推荐

  1. jdk 1.7 在ubuntu 环境配置

    在/opt/里解压了jdk 1.7后 设置环境变量 chen@caicai ~ $ vim .profile export JAVA_HOME=/opt/jdk1..0_79 export JRE_H ...

  2. 网页嵌入swf代码

    <object class id="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://dow ...

  3. Ubuntu 15.10下droidbox安装使用

    DroidBox是一个动态分析Android代码的的分析工具.其目前的安装环境为:Linux/Unix/MacOSX 下面是安装步骤 一. 安装Android SDK 并添加环境变量 export P ...

  4. 页面遮罩层,并且阻止页面body滚动。bootstrap模态框原理

    实现思路: 1.需要有一个层将body遮住,放在body上方. 2.修改body的overflow属性值为:hidden 废话不多说了,将关键代码贴出来了,兼容火狐,谷歌,ie 遮罩层的样式代码,红色 ...

  5. css3 transition的各种ease效果

    http://www.w3school.com.cn/tiy/t.asp?f=css3_transition-timing-function2 linear 平均速度 ease 快启动,慢停止,物理原 ...

  6. 【leetcode】Populating Next Right Pointers in Each Node II

    Populating Next Right Pointers in Each Node II Follow up for problem "Populating Next Right Poi ...

  7. [Linux]yum开启rpm包缓存

    在CentOS下用yum安装,回发现在/var/cache/yum/下的base.extrs和updates下的packages下都没有发现下载的RPM 原来在/etc/yum.conf下没有设置下载 ...

  8. java web 学习 --第十天(Java三级考试)

    第九天学习内容:http://www.cnblogs.com/tobecrazy/p/3470195.html 需求概述 创建程序模块,读取并显示数据库中的书籍信息.当前有如下需求:需要显示数据库中所 ...

  9. static cross compile gtk-2.16.6+gtk-directfb+arm-linux (arm-linux-gcc-3.4.4+glib-2.3.5)

    ----------------------------------------------------------------------- In Ubuntu 10.4 Desktop and & ...

  10. Debian 配置apt-get源

    1.配置apt-get源 cp  /etc/apt/sources.list  /etc/apt/sources.listbak   #备份原有配置文件       nano  /etc/apt/so ...