下面代码可以编译可以通过并能执行
procedure TForm1.Button1Click(Sender: TObject);
var
  Flist : Tlist;
  p,q : pchar;
  s : string;
begin
  Flist := Tlist.Create;
  s := 'abc';
  p := pchar(s);
  Flist.Add(p);
  q := Flist[0];
  showmessage(q);
  flist.Free;
end;
下面却不能编译通过
procedure TForm1.Button1Click(Sender: TObject);
var
  Flist : Tlist;
  p,q : pchar;
  s : string;
begin
  Flist := Tlist.Create;
  s := 'abc';
  p := pchar(s);
  Flist.Add(p);
//  q := Flist[0];
  showmessage(Flist[0]);
  flist.Free;
end;
错误是Incompatible types: 'String' and 'Pointer' 请高手指点一下。多谢。

解决方案 »

  1.   

    Flist[0] 是 Pointer 类型的, 无类型指针
    所以使用Flist[0]的时候得做次转换 , 你前边没错,是因为已经做过一次转换了, p := pchar(s);
    showmessage(pchar(Flist[0]));
      

  2.   

    同意楼上,
    这个类是用来存放指针的,你可以把它当成指针数组来使用。指针是4个字节的整数。与要显示的字符串类型不符,因此showmessage无法显示。
      

  3.   


    指针用错了pchar(S)  这个转换,新版本的DELPHI不知道,老版的话,S没有增加引用次数,这样玩下去会出问题的.
      

  4.   

    Incompatible types: 'String' and 'Pointer'类型转换无效,需要一个显式的类型转换,强制类型转换showmessage(String(Flist[0]));
      

  5.   

    //FList本质上是一个存Pointer的数组,存入时需要把字符串的堆地址放进去就可以了!var
      Flist : Tlist;
      s : string;
    begin
      Flist := Tlist.Create;
      s:='abc';
      Flist.Add(Pointer(Integer(s)));
      showmessage(string(Flist[0]));
      flist.Free;
    end;