有个奇怪的问题,意图如下:通过移动指针,来实现修改字符串.例如:把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的指针地址并没有改变.那我应该如何实现阿.
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的指针地址并没有改变.那我应该如何实现阿.
改成 Inc(Integer(pp),5);
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;
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;
简单些操作不更好?
PChar(p^):='0123456789'; 后p实际指向了另一块内存区域,而不是你刚申请的我一般这样用:StrPCopy(p,'0123456789');
现在把这100的空间平均分别分给p1,p2这两个指针.其中p1指向p+offset 0 的位置 而p2指向p+offset 50的位置.
现在把这100的空间平均分别分给p1,p2这两个指针.其中p1指向p+offset 0 的位置 而p2指向p+offset 50的位置.->
GetMem(p,nSize);
p1:=p;
p2:=PChar(Integer(p)+nSize div 2);是这个意思吗?
应该是这里的问题吧,加错了对象,所以“Inc之后,pp的指针地址并没有改变.”
delphi72()给出的解答没试,应该没有问题吧。postren(小虫) 虽然没说,但是他也把代码改成如下:
Inc(PChar(pp),5);