Delphi中关于Move的操作

在Delphi中,Move是这样来定义的:

procedureMove(constSource; varDest; Count: Integer);

这几天程序用到一个缓冲数据的截取,定义了一个PAnsiChar,然后来截取其中的一部分数据,发现总有问题.

var

d,s: PansiChar;

begin

s:='123456';

d := ansiStrAlloc(3);

Move(s,d,3);

ShowMessage(d);

StrDispose(d);

后来在网上搜索了一下,发现问题出在move的操作上,正确的做法应该是:

var

d,s: PansiChar;

begin

s:='123456';

d := ansiStrAlloc(3);

Move(s^,d^,3);

ShowMessage(d);

StrDispose(d);

再来看move的源码:

procedure Move( const Source; var Dest; count : Integer );

{$IFDEF PUREPASCAL}

var

S, D: PChar;

I: Integer;

begin

S := PChar(@Source);//取内存地址

D := PChar(@Dest);//取内存地址

if S = D then Exit;

if Cardinal(D) > Cardinal(S) then

for I := count-1 downto 0 do

D[I] := S[I]

else

for I := 0 to count-1 do

D[I] := S[I];

end;

如果直接传入s,S := PChar(@Source);//取内存地址 就相当于取的字符串S地址的地址.

如果传入的是ps^,S := PChar(@Source);//取内存地址 就相当于取pchar 所指向字符串实际数据的地址.