procedure TForm1.Button1Click(Sender: TObject);
var ptr, ptr2 : ^integer;
i : integer;
begin
  i:=111;
  ptr:=@i;
  edit1.Text:=inttostr(ptr^);
  ptr2:=pointer(i);//怀疑转化为指向variant类型的指针,edit2.Text:=vartostr(ptr2^);同样报错
  edit2.Text:=inttostr(ptr2^);//这行报错
end;

解决方案 »

  1.   

    ptr := @i; //把变量i的地址赋给ptr,此时ptr指向i,即ptr^ = iptr2 := pointer(i);//把变量i的值赋给ptr2,此时ptr2指向地址为i值的内存位置,如果i值随意,则容易内存越界
      

  2.   

    根据你的描述,给你解释一下为什么报错:
      i:=111; 
      ptr:=@i;                       //让ptr指向i所在的地址,正确
      edit1.Text:=inttostr(ptr^);    //显示ptr所指向的内存空间的内容,即i的值,正确
      ptr2:=pointer(i);              //强制转换i的内容为一个地址,即让ptr2指向内存111这个地址,正确。  edit2.Text:=inttostr(ptr2^);   //取ptr2所指向的内存空间的内容,即111这个地址的内容,非法访问,报错。 
                                          //ptr2^, 取指向111这个地址的内容,111这个地址不允许访问。肯定报错。  连个的区别:
      pointer(i),将i的内容强制转换为一个地址。
      @i  取变量i的内存地址
      

  3.   

    pointer(x)
    =========
    从X的首地址开始取4字节,并强制转换为Pointer类型@x
    =========
    取X的首地址
      

  4.   

    pointer(x) 
    ========= 
    取X的变量内容转换为Pointer,大小为sizeof(Pointer).可能截断X的实际数据.@x 
    ========= 
    返回一个变量,该变量大小sizeof(Pointer),变量内容指向X的地址.