delphi数组问题



最近一直为数组的问题困绕。数组的值老是传不对。

procedure sendData(cosnt buf;len:integer);
var
   buffer:array of byte;
begin
   move(buf,buffer,len);//这里buffer没有正常将buf的值赋过来
   //.... 
end;


经过研究发现是由于静态数组和动态数组,指针的指向是不一样的。 string类型也是动态数组。
如下例子。

静态数组
procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      a:Array[0..10]   of   integer;  
      b,c:pointer;  
  begin  
      b:=@a;  
      c:=@(a[0]);  
      showmessage(inttostr(integer(b))+'   '+inttostr(integer(c)));         --相等
  end;


procedure   TForm1.Button2Click(Sender:   TObject);  
  var  
      a:array   of   integer;  
      b,c:pointer;  
  begin  
      setlength(a,10);  
      b:=@a;  
      c:=@(a[0]);  
      showmessage(inttostr(integer(b))+'   '+inttostr(integer(c)));    --不相等
 
      b:=a;  
      c:=@(a[0]);  
      showmessage(inttostr(integer(b))+'   '+inttostr(integer(c)));    --相等
  end;

这两个例子可以说明。动态数组的变量名,不等于第1个数组,它是一个地址.
静态数组名等于第1个数组


所以在使用Move这个函数时,它取了source和Dest的地址进行赋值操作,如下:
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;

动态数组应该如下传值
var
   buffer:array of byte;
begin
   move(buf,buffer[0],len);


静态数组应该如下传值
var
   buffer:array of byte;
begin
   move(buf,buffer,len);

转载于:https://www.cnblogs.com/sunlinjun/archive/2009/12/18/1559228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值