zoukankan      html  css  js  c++  java
  • Delphi中关于Move的操作

    在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 所指向字符串实际数据的地址.
  • 相关阅读:
    团队冲刺2.7
    单词接龙
    团队冲刺2.6
    梦断代码阅读笔记02
    团队冲刺2.5
    吾日三省吾身(6)
    吾日三省吾身(5)
    周计划01(20200921-20200927)
    吾日三省吾身(4)
    吾日三省吾身(3)
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/2072416.html
Copyright © 2011-2022 走看看