procedure TForm1.Button1Click(Sender: TObject);
var
  p: Pointer;
  s: string;
begin
  s := 'a23';
  p := PChar(s);
  Byte(p^) := Ord('1');//想要实现 s[1] := '1',但这里报错
  ShowMessage(s);
end;

解决方案 »

  1.   

    是编译通不过么?
    Byte(p^)换成PByte(p)^试试
      

  2.   

    编译能通过,换成这个PByte(p)^以后编译也能通过,但运行时还是报错,还是 Access Violation.
      

  3.   

      p := PChar(s)+1; 
      PByte(p)^:= Ord('1');
    试试看
      

  4.   

    S是变量,在任何情况下你都可以直接修改,但是
    p := PChar(s); 
    这之后,P就是一个常量指针,常量指针所指的内容不可被修改,但是指针的指向地址可以修改
    而指针常量的话,则是指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
    var 
      p: PChar;
      s: string;
    begin
      s := 'a23';
      p := PChar(s);
      GetMem(p,Length(S));
      CopyMemory(p,PChar(s),Length(s));
      P[0] := '1';
      s := p;
      ShowMessage(s[1]);
      FreeMem(p,Length(s));
    end;
    搞不明白楼主为什么要绕一个圈子来实现这功能。。
    希望我没搞错,水平有限
      

  5.   

    看反汇编就知道了,str[N] 为 l-value 时会调用 system._UniqueString*,把常量字符串变成了变量。所以 str[N] 为 l-value 时效率非常低