var
  Pi:Pointer;
  A,B:Integer;
begin
  A:=1;B:=2;
  Pi:=@B;
  A:=Integer(Pi^);
  ShowMessage(IntToStr(A));
end;
  参看帮助中关于Pointer这一节,说But a Pointer variable cannot be dereferenced; placing the ^ symbol after a Pointer variable causes a compilation error.即无类型指针是不能解除引用的,但为什么上述代码能正确编译并得到正确答案呢?

解决方案 »

  1.   

    正好前几天刚有人问过这个问题:
    http://topic.csdn.net/u/20090303/21/f2a3f61a-2906-47af-a40e-1cc4e8065ab1.html由于Pointer(AVar)^是没有类型的,不包含任何关于宽度的信息,所以当试图对其指向的地址直接进行不包含任何长度信息的读写的时候,编译器会无法确定宽度,才出现错误。Pointer(AVar)^的用法本身还是很常见的,比如 
    var p: Pointer; 
    ... 
    Integer(p^) := 0; 
    这样的语法完全是可以的,因为Integer已经给了关于变量宽度的信息。
      

  2.   

    谢谢,觉得帮助里对Pointer的解释有些问题。