有个奇怪的问题,意图如下:通过移动指针,来实现修改字符串.例如:把0123456789,修改为01234ABCDE代码如下:var
  p,pp: Pointer
begin
  GetMem(p,10);
  PChar(p^):='0123456789';
  Label1.Caption := PChar(p^);
  pp:=p;  Inc(Char(pp^),5);  PChar(pp^):='ABCDE';
  Label2.Caption := PChar(pp^);  Label3.Caption := pchar(p^);
end;运行结果如下:
Label1显示 0123456789
Label2显示 ABCDE
Label3显示 ABCDE发现问题没有? 用Inc移动指针后,再进行修改,结果,整个指针的内容都变了.跟踪进去看,发现其实在Inc之后,pp的指针地址并没有改变.那我应该如何实现阿.

解决方案 »

  1.   

    将Inc(Char(pp^),5);
    改成  Inc(Integer(pp),5);
      

  2.   

    在你的代码中GetMem(p, 10)根本就没什么用当你这样赋值的时候  PChar(p^):='0123456789';所用的空间不是GetMem中得到的
      

  3.   

    给你写的段代码如下,供参考var
      p,pp: Pointer;
      S: string;
    const
      MemSize = 11;
    begin
      GetMem(p, MemSize);
      S := '0123456789';
      CopyMemory(p, @S[1], Length(S)+1);
      Label1.Caption := PChar(p);
      pp:=p;  Inc(PChar(pp),5);
      S := 'ABCDE';
      CopyMemory(pp, @S[1], Length(S)+1);
      Label2.Caption := PChar(pp);
      Label3.Caption := pchar(p);
      FreeMem(p, MemSize);
    end;
      

  4.   

    var
      p:pchar;
      i:integer;
    begin
      try
        GetMem(p,11);
        for i:= 0 to 9 do
           p[i]:=char($30+i);
        p[10]:=#0;
        label1.Caption:=StrPas(p);
        for i :=5  to 9 do
          p[i]:=char(ord('A')+i-5);    label2.Caption:=StrPas(p);
      finally
        FreeMem(p);
      end;
    end;
    简单些操作不更好?
      

  5.   

    如小虫所说,
     PChar(p^):='0123456789'; 后p实际指向了另一块内存区域,而不是你刚申请的我一般这样用:StrPCopy(p,'0123456789');
      

  6.   

    其实我的目的不仅仅是要修改字符串,而是希望能用实现分配的开快内存中细分来使用.例如:getmem(p,100)
    现在把这100的空间平均分别分给p1,p2这两个指针.其中p1指向p+offset 0 的位置 而p2指向p+offset 50的位置.
      

  7.   

    例如:getmem(p,100)
    现在把这100的空间平均分别分给p1,p2这两个指针.其中p1指向p+offset 0 的位置 而p2指向p+offset 50的位置.->
    GetMem(p,nSize);
    p1:=p;
    p2:=PChar(Integer(p)+nSize div 2);是这个意思吗?
      

  8.   

    Inc(Char(pp^),5);
    应该是这里的问题吧,加错了对象,所以“Inc之后,pp的指针地址并没有改变.”
    delphi72()给出的解答没试,应该没有问题吧。postren(小虫) 虽然没说,但是他也把代码改成如下:
    Inc(PChar(pp),5);