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 所指向字符串实际数据的地址.
  • 相关阅读:
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分
    1025 反转链表 (25 分
    1024 科学计数法 (20 分
    1023 组个最小数 (20 分)
    将命令的输出保存到文件
    使用与管理控制台历史
    度量命令执行时间
    检查最后运行命令的状态
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/2072416.html
Copyright © 2011-2022 走看看