Delphi中关于Move的操作

本文探讨了在Delphi编程环境下如何正确使用Move函数来处理字符串数据的复制操作。通过对比错误与正确的代码示例,揭示了Move函数在处理PAnsiChar类型时需要注意的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

procedure Move(const Source; var Dest; 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 所指向字符串实际数据的地址.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值