var
a:integer;
p:pointer;
begin
a:=55;
p:=@a;
showmessage(inttostr(integer(p^)));
end;
为何showmessage(inttostr(integer(p^)))不可以写成showmessage(inttostr(p^)),p^不就是55吗?P指向a的地址,integer(p^)代表什么意思?我没有找到integer这个函数的用法.integer的用法是integer(地址),还是integer(地址中的内容),返回值是地址中的内容,即代码中的55.
请大家指点.

解决方案 »

  1.   

    integer() 这样是强制类型转换。PASCAL是严格类型检查的语言,POINTER这样无类型的指针,当要访问指向的数据时,必须明确
    告诉编译器,你想要指的是哪种数据类型的。。
    编译器对POINTER指向的数据不作任何类型的缺省假定。。
      

  2.   

    (*
    var
    a:integer;
    p:pointer;
    begin
    a:=55;
    p:=@a;
    showmessage(inttostr(integer(p^)));
    end;
    为何showmessage(inttostr(integer(p^)))不可以写成showmessage(inttostr(p^)),
    p^不就是55吗?P指向a的地址,integer(p^)代表什么意思?我没有找到integer这个函数
    的用法.integer的用法是integer(地址),还是integer(地址中的内容),返回值是地址中
    的内容,即代码中的55.
    请大家指点.
      //================
      你的错误原因:你的指针p,它是个空指针,对应于c++的void类型的指针,不指向
      任何类型,仅仅是个地址而已,除非进行显示转化,否则不能进行指针运算,也不能
      间接引用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>...象下面这样就行!
    *)
    procedure TForm1.Button1Click(Sender: TObject);
    var a:integer;
        //p:pointer;
        pTemp:^integer;
    begin
      a:=55;
      pTemp:=@a;
      showmessage(inttostr(pTemp^)+#10#13+inttostr(integer(pTemp^)));
    end;
      

  3.   

    integer(p^)的意识是把地址中的内容强制转换成整型
    p:pointer这样定义编译器无法识别地址中内容的类型,所以得先强制转换一下
    这样定义就不用转了
    var
    a:integer;
    p:^integer;
    begin
      a:=55;
      p:=@a;
      showmessage(inttostr(p^));
    end;
      

  4.   

    因为p是个无类型的指针啊,而pasic的数据类型相当严谨,用p^是不可以直接给变量赋值的啊,你也可以这样这样写:
    var b:integer;
    begin
      b:=integer(p^);//因为他是个无类型指针啊
      showmessage(inttostr(b));
    end;
    就好了哦
      

  5.   

    恩 上面得都說得很好 :-)為什麼 不能給void/pointer類型指針進行存取那。
    因為void/pointer類型沒辦法確定其代表得大小 也就是其尋址空間不能確定比如
    p: PInteger;new(p);
    p^ := 999; // p是一個Integer型指針 編譯器就知道該尋址一個Integer大小得空間 然後進行賦值
      

  6.   

    谢谢大家的讲解.我明白了.
    既然有INTEGER(P^),不知有没有STRING(P^),强制转换成字符型,或者是别的类型.