procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  pc: PChar;
begin
  s:='abcdefg12345';
  pc:=PChar(s);
  ShowMessageFmt('%s=%s ?',[IntToHex(Integer(@s[1]),4), IntToHex(Integer(@pc[0]),4)]);
end;ShowMessageFmt显示结果,内存地址不一致。
如果是内存复制,那么我把s赋1G字节的值,执行pc:=PChar(s);瞬间完成。请高手讲解。

解决方案 »

  1.   

    指针引用string会记录被引用的次数
      

  2.   

    指针,string是引用计数的,Pchar不是,Pchar只是一个指针,string才是完全复制内容
      

  3.   

    1:
    const
      s: string='abcdefg12345';
    var
      pc: PChar;
    begin
      pc:=PChar(s);
      ShowMessageFmt('%s=%s ?',[IntToHex(Integer(@(s[1])),4), IntToHex(Integer(pc),4)]);
    end;2:
    var
      s: string;
      pc: PChar;
    begin
      s:='abcdefg12345';
      pc:=PChar(s);
      ShowMessageFmt('%s=%s ?',[IntToHex(Integer(s),4), IntToHex(Integer(@pc[0]),4)]);
    end; 如楼上所讲,s作变量时会有引用计数处理,当执行s[1]这样的操作时,会复制一份string,这时地址看起来就不一样了,
    1 但用const修饰时,就没有引用计数的问题了,
    2 直接显示s的地址时,也不会引起引用计数的问题
      

  4.   

    那么为什么showmessage显示内存地址不一致呢?
      

  5.   

    sonicer回答的真好真详细。明白了,谢谢。