procedure       Move( const Source; var Dest; count : Integer );
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;这个是delphi自带的代码里面
Cardinal(D) > Cardinal(S) 这个看不懂
2个pchar转Cardinal到底什么意思,这个大小比较要是为什么?什么影响他们的大小呢???
只有10分了,请帮帮忙

解决方案 »

  1.   

    Cardinal(D)和Cardinal(S)实际上是把两个PChar的指针(指针本来就是4个字节的整数),强制转换成一个无符号4字节整形数。大小比较不知道有什么意义,无非是在内存中的先后位置。
    如果D的位置在后,则从后拷到前,如果D的位置在前,则从前拷到后。可以优化效率吗,疑惑ing?
      

  2.   

    如果Source和Dest是相互重叠的(比如它们两个是同一个数组), 则要根据源和目标哪个在前哪个在后来决定移动应该是从最后一个元素开始还是应该从第一个元素开始,否则会丢失数据。因此,才有了Cardinal(D) > Cardinal(S)这个比较。比如:
    var
      A : array [0..99] of byte;
    begin
      Move(A[0], A[10], 90);      //此时必须从最后一个数组元素开始进行移动
      Move(A[10], A[0], 90);      //此时必须从第一个数组元素开始进行移动
    end;