delphi中move函数的用法

来源:互联网 发布:java 模仿快手网站源码 编辑:程序博客网 时间:2024/05/17 03:48

我们能看到以下代码
var pSource,pDest:PChar;
     len: integer;
.......................//一些代码
Move(pSource,pDest,len); //错误
Move(pSource^,pDest^,len); //正确
看起来确实好像是传值,而不是传地址,但是各位别忘了,这不是C,C++,而是Delphi
Object Pascal,所以,绝不能从函数调用的方法判断是传值还是串地址!!必须看函数的
定义,只有定义才能说明是传值还是传地址,再说一遍,这不是C,C++!!
我们看到的函数定义是这样的
procedure Move(const Source; var Dest; Count: Integer);
从定义上看,很清楚,Dest是传地址,而不是传值,那么Source呢,其实大家不太清楚
这里的Const修饰符有两个含义,第一个大家都知道就是Source一常量方式在函数体内,
不可以改变它的值,第二个可能知道的人不多,那就是Source的传递方式和Dest一样,
是传地址!也就是说const和var一样,都是传地址,只不过一个在函数内不允许修改,
另一个是修改后影响调用的变量值
所以Move是传地址,而恰恰不是传值!

Move(const   Source;   var   Dest;   Count:   Integer);  
  Source   and   Dest都是指向一个首地址,  
  如  
  var                                                                 首地址  
      P:   Pointer;                                                P^  
      P:   PChar                                                   P^  
      //只要是指针类型就是                                     P^  
      S:   string                                                  S[1];  
      Arr:   array   [0..10]   of   Char;                 Arr[0]   or   Arr  
      Arr:   array   [0..10]   of   TDataRecord     Arr[0]   or   Arr  
      //只要是array   类型就是                              Arr[0]   or   Arr  
     
  明白首地址后,就很容易明白C   的memcpy和Delphi的Move   ,或API的MoveMemory/CopyMemory,就是内存

的相互Copy,只要给出首地址就行了。  
   
  当然在数组中首地址也可以不是0开头,有时我们对一个record   or   array进行赋值时,是一个个域进行

赋值,如下:  
  type  
      TArrChar:   array   [0..3]   of   Char;  
   
  procedure   SetValue(Arr:   TArrChar);  
  var  
      Chars:   array   of   Char;  
  begin  
      SetLength(Chars,   4);  
      Chars[0]   :=   Arr[0];  
      ...  
  end;  
   
  我们可以如此:  
  procedure   SetValue(Arr:   TArrChar);  
  var  
      Chars:   array   of   Char;  
  begin  
      SetLength(Chars,   4);  
      Move(Arr,   Chars,   SizeOf(Char)   *   4);  
  end;  
       
  record类型也可以这样,不过要注意对string/array类型进行静态分配空间;   如  
      S:      string[255];  
      Arr:   array   [0..len]   of   TMyType