procedure TForm1.btn1Click(Sender: TObject);
type
  rd=record
   i:^pchar;
  end;
var
   a:char;
   pa:pchar;
   p:^pchar;
   r1:rd;
begin
      a:='w';
      pa := @a;
      r1.i :=@pa;
      p:= Pointer(r1.i);//若写为p:=r1.i则编译时提示:Incompatible types,为啥?
      caption := p^^;
end;

解决方案 »

  1.   

    很简单,原因就是Delphi/ObjectPascal对类型的检查非常严格,将不在同一行申明的两个^X指针视为不同类型的指针.
    参见《Delphi开发人员指南》第45页。
    例如:
    var
      a:^integer;
      b:^integer;
    begin
      a := b; //编译器报错:不同类型。
    end;如改为:
    type
      PInteger = ^integer;
    var
      a:PInteger;
      b:PInteger;
    begin
      a := b; //OK
    end;或者:
    var
      a, b:^integer;
    begin
      a := b; //OK
    end;没其他的原因,就是因为编译器对程序员负责,检查很严格。相对于说C/C++就是弱类型定义语言了。你的程序如果这样改就没问题了:type
      TP=^pchar;
      rd=record
      i:TP;
      end;
    var
      a:char;
      pa:pchar;
      p:TP;
      r1:rd;
    begin
          a:='w';
          pa := @a;
          r1.i :=@pa;
          p:= r1.i;//没问题
          caption := p^^;
    end;