在C语言中,指针变量除能够指向数据对象外,也可以指向函数。
一个函数在编译时,分配了一个入口地址,这个入口地址就成为函数的指针。函数的指针能够赋给一个指向函数的指针变量,并能够通过指向函数的指针变过量调用它所指向的函数。
定义一个指向函数的指针变量的一般形式是:
类型标识符 (*指针变量名)();
例如:用指向函数的指针调用函数
main()
{
int min(int a, int b);  /* 声明min函数 */
int (*P)();             /* 定义指向函数的指针 */
int x,y,z;
P=min;  /* 指针P指向函数min的入口地址,不必写函数形参 */
scanf("%d,%d",x,y);z=(*P)(x,y);printf("x=%d y=%d  min=%d",x,y,z);
}
int min(int a,int b);
{
int c;
c=a<b?a:b;
return(c);
}
//////////////////////////////////////////////////
上面是从书上看到的一段话,看完之后我就开始想,在delphi中有没有这种指向函数的指针存在哪?下面是我的实现方法。

解决方案 »

  1.   

    type  TMyTest = procedure(aaa:integer) of object;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var Ptest:TMyTest;
    begin
        Ptest:=test;
        Ptest(65);
    end;procedure TForm1.test(aaa: integer);
    begin
        showmessage(Char(aaa));
    end;end.
    功能虽然实现了,但是和C语言的实现已比较,就感觉到delphi中的实现简直是太笨重了,难道说我为了实现一种函数的指针还要专门定义一个TMyTest = procedure(aaa:integer) of object;
    在这里贴出来是为了请教各位大虾,有没有比较灵活的实现方法,我觉得C能做到的delphi也一定能够做到,而且应该做的更好,等待大家的执教!!!^_^
      

  2.   

    int (*P)();             /* 定义指向函数的指针 */type  TMyTest = procedure(aaa:integer) of object;
    var Ptest:TMyTest;从本质上讲,是一样的,都是定义函数原型,再定义一个指针,没有任何区别
    对于其中的可读性,见仁见智c里面一样可以用typedef来实现,你这个属于特殊例子,如果定义多个变量肯定不会重复
    int (*P)();
    而是用typedef实现
      

  3.   

    主要是感觉C中定义指针就不用受形参的限制,但是delphi中如果形参不同就要定义不同的TMyTest,而且不能相互的赋值,感觉灵活性上要差一些!!!
      

  4.   

    main(){
      int min(int a, int b);
      int (*P)();
      int x,y,z;
      P=min;
      scanf("%d,%d",&x,&y);/*这里更正一个错误,scanf是要求地址的*/
      z=(*P)(x,y,z);
      /*
        这里故意写错,多写一个参数,编译通过,运行时忽略了z,这个问题不严重么?
        可以说是自由,但不得不承认,这是个问题,
        至于调用的时候到底压几个参数入栈,出来的时候清理了几个,我没有看
        如果压进3个,问题就出现了,以后对栈的调用,都会错乱
        如果压进2个,只能说编译器比较聪明,看代码的人却胡涂了
      */  printf("x=%d y=%d  min=%d",x,y,z);
    }int min(int a,int b){
      int c;
      c=a<b?a:b;
      return(c);
    }
      

  5.   

    z=(*P)(x);
    /*这样调用也可以*/
      

  6.   

    不需要type声明也可阿
    procedure TForm1.Button1Click(Sender: TObject);
    var Ptest: procedure(aaa: Integer) of Object;
    begin
        Ptest:=test;
        Ptest(65);
    end;
      

  7.   

    Delphi中参数个数不对,肯定是编译都通不过的,号称严谨,好处是c号称自由,自由的代价是出错的几率也大,而且错误很隐蔽
      

  8.   

    同意楼上 DELPHI的类型检测更强,更严格一些
      

  9.   

    两种语言各有特色,C的指针用法虽然灵活,但是也存在滥用的情况,Pascal就是Pascal,没必要用C的标准来要求
      

  10.   

    相比之下,
    .net的检查更为严格,
    函数签名不同就会报错,
    这样就是类型安全的了
      

  11.   

    呵呵,谢谢老达摩。
    /////////////////////////////
    回复人: sdzeng(大头鸟) ( ) 信誉:100  2005-07-11 13:05:00  得分: 0  
     
     
       两种语言各有特色,C的指针用法虽然灵活,但是也存在滥用的情况,Pascal就是Pascal,没必要用C的标准来要求
    //==========================================================
    我是在看一本关于C的书的时候偶尔看到的关于指向函数的指针的,所以想看看delphi中怎么实现,没有可以用C的标准来要求delphi的,不过Pascal的语法确实比较严谨,现在认识更深刻了,呵呵!!!
      

  12.   

    订正
    没有可以用C的标准来要求delphi的
    此处可以为“刻意”的笔误
      

  13.   

    如果我生锈的大脑没有记错的话,用一个'@'可以将其转化为无类型的函数指针,也就没有你所说的参数问题。先看看以前的帖子和online help吧。
      

  14.   

    firetoucher(风焱)老大能详细说说吗?!
      

  15.   

    事实上int min(int a, int b);  /* 声明min函数 */
    int (*P)();             /* 定义指向函数的指针 */
    int x,y,z;
    P=min;  /* 指针P指向函数min的入口地址,不必写函数形参 */
    scanf("%d,%d",x,y);z=(*P)(x,y);这些代码对于标准C来说并不是合法的,在标准c中编译器要进行类型检查
    c++primer书中曾说过
    "省略实参或者传递类型错误的实参都是c语言标准化之前严重的运行时刻错误的根源"
      

  16.   

    去看看Java吧,Delphi中的一个事件赋值语句button.onclick=button1click 在java中要用一个匿名类来实现!比起来Delphi简单多了。
      

  17.   

    翻了翻从前的帖子,发现了风炎所说的那种情况,如下的调用都是可以的
      TMyTest=procedure(a:integer);
    var
      Form1: TForm1;implementation{$R *.dfm}procedure test1(a:integer);
    begin
        showmessage(Char(a));
    end;procedure test2(a:string);
    begin
        showmessage(a);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var MyTest:TMyTest;
    begin
        MyTest:=@test1; //这样调用没有任何问题,和下面的作用一样
        //MyTest:=test1;
        MyTest(65);
    end;procedure TForm1.Button2Click(Sender: TObject);
    var MyTest2:TMyTest;
    begin
        MyTest2:=@test2; //这样编译没有问题,但是执行会出错
        MyTest2(65);
    end;end.
      

  18.   

    另外声明为of Object实际上应该是给Class中的Method使用的,所以,更为一般的说的话,应该声明为TMyTest=procedure(a:integer);这种格式
      

  19.   

    我有个兄弟在搞java回去请教请教他去!!!