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. C 语言 homework(2)

    <C语言程序设计>实验报告 学 号 160809215 姓 名 韩笑 专业.班 计科16-2班 学 期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C区二层机房 机 器 ...

  2. 剑指Offer 跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法.   解题思路: f(n)=f(n-1)+f(n-2); f(1)=1,f(2)=2;   AC代码 ...

  3. windows下vim编辑器,字符编码设置。

    在windows下的vim默认字符集修改 之前使用vim编辑器的时候碰到乱码的问题,后来在网上看了记下了:在vim编辑器中按esc进入命令模式 1.修改vim内部编码    set encoding= ...

  4. map的4种遍历方式

            System.out.println("key= "+ key + " and value= " + map.get(key));    }   ...

  5. linux下一个有意思的问题(文件名以短划线或空格开头)

    linux下一个有意思的问题(文件名以短划线开头) 这本是无意中的一个发现. 在linux下,文件名中含有 - 是没有问题,但是如果文件名是以-作为第一个字符的,那么就比较麻烦了. 问题演示 看这里, ...

  6. js之作用域和面向对象

    作用域 JavaScript以函数为作用域 函数的作用域在函数未被调用之前,已经创建 函数的作用域存在作用域链,并且也是在被调用之前创建 示例一 xo = "alex"; func ...

  7. 9.3---魔术索引(CC150)

    魔术索引1:此外下一次应该看看课本上的方法. public boolean findMagicIndex(int[] A, int n){ for(int i = 0; i < A.length ...

  8. TortoiseSVN使用方法

    1.初始化本地SVN目录,在某个文件夹鼠标右键点击. 初始化后目录 2.将某个目录下代码,添加到SVN目录中.                            3.将添加进去代码提取出来. 在某 ...

  9. MQTT协议(一)

    MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约.轻量,易于使用,针对受限环境(带宽低.网络延迟高.网络通信不稳定),可以简单 ...

  10. dump、cpio、tar、dd四种备份工具比较

    原文  http://blog.csdn.net/ether_lai/article/details/12656219 dump dump可执行文件系统增量备份的存储操作 ,dump 可将目录或整个文 ...