var s:string;
    p1,p2:pchar;
begin  s:='abcde';
  p1:=pchar(s);
  p2:=pchar(@s[1]);
  showmessageFmt('%s(%d)  %s(%d)',[p1,Integer(p1),p2,integer(p2)]);
end;以前我一直以为pchar(s)和pchar(@s[1])是等效的,结果显示,p1,p2指向的地址并不一样!哪位高手知道的解释一下

解决方案 »

  1.   

    之前就有类似的贴子讨论过,你可以搜索一下。
    前者直接取的是当前s的地址,后者则是强制复制s(如果之前S没有引用计数,则会被释放只保留新的内存)。
      

  2.   

    我以前解答过类似的问题:
    http://bbs.2ccc.com/topic.asp?topicid=337151
      

  3.   

    果然如你所说的,s[1]会重新分配内存,我把 
      p1:=pchar(s);
      p2:=pchar(@s[1]);
    改成
      p2:=pchar(@s[1]);
      p1:=pchar(s);
    后,p1,p2都指向同一个地址了。结帖了