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

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

delphi数组问题相关推荐

  1. delphi数组与c语言数组不同,delphi数组间的赋值

    解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢.在函数参数中使用数组的时候,数组将被转换为指针处理 ...

  2. delphi 数组复制利用CopyMemory 最为完美

    delphi 数组复制利用CopyMemory 最为完美 在各网站的文章里面,见复制数据的方法中,有move的,有system.copy的,而要实际应用中,这两种方法,并不是很完美,会遇到一些问题,比 ...

  3. Delphi - 数组 详解

    技术交流,DH讲解. 首先我们要知道什么是数组?数组是一堆相同特性数据的一个集合,也就是每个元素的类型必须是一样的,当然在其他一些弱语法的语言里面,数组的元素可以千奇百怪. 例子: ? 1 2 3 4 ...

  4. Delphi用指针读取数组某个元素

    要点: 1.TBytes和C++里面的数组一样,数组名就是数组的首地址.而array [..] of char 不是指针,需要用取地址符号读地址@ 2.要获取TBytes某个元素位置的指针, 应该是 ...

  5. Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)...

    来源:http://blog.csdn.net/xiongmao000738/article/details/6863988 一.变体类型常用的函数介绍: Variant: 一种可以拥有各种数据类型: ...

  6. Variant 数组

    Variant 数组  Variant:  一种可以拥有各种数据类型:  也可以告诉目前存储的数据是什么类型(通过使用VarType函数):  可以给相同的Variant分配不同的数据类型,只要Var ...

  7. 使用Delphi学COM

    第一章 在Delphi中使用接口 1.1 定义接口:  目的:什么是接口,以及和抽象类的关联以及不同点.  抽象类(备注理解接口最简单的方法)  永远不能创建一个抽象类的实例:  本身不能实现功能,依 ...

  8. 269道各路算法考试题集锦

    1 某编程大赛题(35道题,中等难度) 1.在实际的开发工作中,对于string的处理是最常见的编程任务,本题是要求程序对用户输入的string进行处理,具体要求如下: 1.每个单词的首字母变为大写. ...

  9. 【delphi】Byte数组与String类型的转换

    string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...

最新文章

  1. mysql封装成类_python操作mysql封装成类
  2. 引用的定义、使用及其和指针的区别与联系
  3. java mysql 全文索引_MySQL索引原理
  4. c#FileStream文件读写(转)
  5. 3D 服务器端以向量计算为主的角色位置的算法
  6. PYTHON自动化Day3-列表/元组/切片/字典/字符串处理方法
  7. WPF 使用DrawingVisual绘制高性能曲线图
  8. Linux命令中的$()和${}的区别
  9. 子类怎么继承父类方法中的变量_JavaOOP_04 封装 继承
  10. HTML初识HTML
  11. Prometheus+Grafana监控PostgreSQL
  12. 支付宝小程序平台的IM聊天插件
  13. if else 条件语句
  14. Altium net has no driving source问题
  15. PTA习题【python】 6-8 jmu-python-发牌
  16. BZOJ1066 蜥蜴
  17. linux-防火墙开放端口
  18. 不正经的保姆级西电软工操作系统实验课教程 ==== 专题一
  19. 海康萤石摄像头SDK Java(一)java本地调用摄像头
  20. 使用Let's Encrypt申请永久免费通配符证书

热门文章

  1. Pandas.DataFrame按行求百分数(比例数)
  2. 【2018年更新】Sublime text 3安装教程(Linux版本--Ubuntu)
  3. 第三章:3.6 典型信号傅里叶变换
  4. Jupyter Notebook 使用小记
  5. python之发送HTML内容的邮件
  6. 大熊君学习html5系列之------History API(SPA单页应用的必备------重构完结版)
  7. GET与POST可传递的最大值到底是多少?
  8. 提高代码性能及并发性的方法浅谈
  9. vim中开shell
  10. SuperMap iClient for Leaflet入门学习