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 所指向字符串实际数据的地址.
  • 相关阅读:
    需求采集
    <转>jmeter(十七)目录结构
    《Google软件测试之道》测试开发工程师
    聊聊学习和读书这件事
    聊聊用户
    jmeter(十六)配置元件之计数器
    《探索性软件测试》
    一个完整的性能测试流程
    js外部样式和style属性的添加移除
    jquery获取第一层li
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/2072416.html
Copyright © 2011-2022 走看看