type Func = function(X: Integer): Integer;
var
  F: Func;
  P: Pointer;
  N: Integer;
你可以应用下面的赋值语句
  F := Func(P);             { Assign procedural value in P to F }
  Func(P) := F;             { Assign procedural value in F to P }
  @F := P;                  { Assign pointer value in P to F }
  P := @F;                  { Assign pointer value in F to P }
  N := F(N);                { Call function via F }
  N := Func(P)(N);          { Call function via P }====================================
以上每一个赋值如何理解?还请大侠高手指点!谢谢!

解决方案 »

  1.   

    这个object pascal中的函数类型其实就是指向函数的指针,所以可以赋值,就是再赋一个函数的地址给他。你可以研究一下c++甚至c的指向函数的指针这一节内容,会有帮助的。在c#中没有指针了,就改了名字叫委托了。这个东西有点绕,搞多了就明白了,其实不难。windows的时间处理就是利用了这个东西,因为写button控件的人不知道将来的button1.click处理函数是什么,所以就定义一个click的事件类型(其实就是函数类型),当编程人员在写了click的具体内容后,再由编译器是用类似的语句连接起来(button1.onclick=button1.click; 这个语句在.dfm文件中),button1.onclick是函数类型的指针,button1.click是真正的函数,它包括一个头指针。
      

  2.   

    有几处错误,可能不好理解
    这个object pascal中的函数类型其实就是指向函数的指针,所以可以赋值,就是再赋一个函数的地址给他。你可以研究一下c++甚至c的指向函数的指针这一节内容,会有帮助的。在c#中没有指针了,就改了名字叫委托了。这个东西有点绕,搞多了就明白了,其实不难。windows的事件处理就是利用了这个东西,因为写button控件的人不知道将来的button1.click处理函数是什么,所以就定义一个onclick的事件类型(其实就是函数类型),当编程人员在写了click的具体内容后,再由编译器是用类似的语句连接起来(button1.onclick=button1.click; 这个语句在.dfm文件中),button1.onclick是函数类型的指针,button1.click是真正的函数。
      

  3.   

    F: Func;             F本身不是函数,是函数类型,本质上就是指向函数的指针
      P: Pointer;          p就是一个普通指针
      F := Func(P);             { 将函数p(是个指针,用func转换类型)赋值给函数类型的F}
      Func(P) := F;             { 将函数类型F赋值给指针p }
      @F := P;                  { 将指针p赋值给函数类型的F }
      P := @F;                  { 将函数类型F赋值给指针p }
      N := F(N);                { 调用函数F }
      N := Func(P)(N);          { 调用函数P(P必须赋过值),调用的时候要转换类型为Func }