Type
       SwapProc=Procedure(Var X,Y:Integer);
       MathFunc=Function(X:Double):Double;{以上是类型声明部分}Var
       P:SwapProc;
       F:MathFunc;{以上把P说明为SwapProc 类型的变量,把F说明为MathFunc类型的变量}Procedure Swap(var A,B:integer);
Var
       Temp:Integer;
Begin
       Temp:=A;
       A:=B;
       B:=Temp;
End;Function Tan(Angle:Double);
Begin
       Tan:=Sin(Angle)/Cos(Angle);
End;{以上定义了一个过程和一个函数}{以上把Swap过程赋给P变量,把Tan函数赋给F变量}
P:=Swap;
F:=Tan;P(I,J); {相当于调用Swap(I,J)}
X:=F(X); {相当于X:=tan(X)}1 既然过程变量是指针类型,为什么P:=Swan 和F:=Tan 不应该时P := @Swan 和F := @Tan,就是所取函数的地址
2 另外@P操作是返回无类型指针(Delphi操作手册里讲到)吗,而且返回的这个指针是指向Swap的 也就是 @P = @Swap 这种说法对吗? 而不是返回P变量的地址吗?
谢谢!

解决方案 »

  1.   

    1. 这个是为了方便程序编写而由编译器特别实现的, p:=swan和p:=@swan是等价的, 因为p指明了类型,对p赋的值不会引起二义性所以编译器就让过了. delphi中的类似例子还很多, 比如:
    type
      TA = array [0..5] of Char;
      PA = ^TA;
    var
      A: PA;
    写A[0]和A^[0]是等价的, 都是操作A指向的数组的第一个元素. 严格说应该只有A^[0]才是对的. 但两者都能通过编译.2. @p也是编译器特殊处理的, 帮助里有, 对函数类型变量@p取的是函数入口, @@p才是取变量的地址