转动态数组的使用

从Delphi支持内建各种类型的动态数组。与静态数组的区别在于数组的长度可以变化。

   一、动态数组的声明
   1、一维数组
var a : array of integer;  // 动态数组定义时不定维数

   2、多维数组
var a : array of array of integer; // 二维数组
var a : array of array of array of integer; // 三维数组

   3、多维数组单元类型
var a : array of integer;  // 动态数组类型整数
var a : array of string;   // 动态数组类型字符串
var a : array of Double;   // 动态数组类型Double
 
   二、动态数组的操作函数:
   1.设置数组大小,可以任意缩减或增加数组大小
Procedure SetLength(var S ; NewLength : integer);

   2.取出连续元素,复制给另一个数组变量
Function Copy(s;Index,Count : integer) : array ;

   3.取得数组大小及上下限
Function Length(s):integer;
Function High(x):integer;
Function Low(x):integer;
   注意不加const或var修饰的动态数组会被作为形参传递。
   动态数组用const修饰并不意味着你不能修改数组里的元素。
   High函数调用了Length 函数,所以我们在获取数组上限时直接用 Length(s) 函数。

   4、动态数组的释放
   一般没必要手动释放, 动态数组离开作用域会自释放。但养成释放是一个好的习惯。
   动态数组释放,就在动态数据不再使用,应与创建在同一层,代码结尾时,通过下列三个函数释放:
var arr: array of Integer;
begin
  SetLength(arr,10);
  arr := nil;         // 释放方法一
  SetLength(arr, 0);  // 释放方法二
  Finalize(arr);      // 释放方法三 
end;

   四、动态数组的结构
   动态数组的内存空间中占用4个字节。 动态数组在内存中的分配表如下:

   偏移量                                   内容
   -8                                       32-bit 引用计数
   -4                                       32-bit 数组长度
   0..数组长度 * (元素尺寸) - 1 数组元素    元素尺寸=Sizeof(元素类型)

   根据上面的分配情况,可以得到如下结果:
   如果我们想要清空一个动态数组只需要把“数组长度”和“引用计数”清空即可。

   五、动态数据实例
//例1:
var StrArr: array of String; 
begin
  SetLength(StrArr,6);    // 分配6个元素位置: 0-5
  StrArr[0] := 'ABCDEFG';  
  ShowMessage(StrArr[0]); // 读写与静态数组一样
  StrArr := nil;          
end;

//例2. 动态多维数组:
var Arr: array of array of Integer; //定义多维数组
begin
  SetLength(Arr,5,5);    // 分配空间
  Arr[0,3] := 100;       // 赋值
  ShowMessage(IntToStr(Arr[0,3])); // 取值
end;

//例3. 动态数组的引用:
var Arr1,Arr2: array of Integer;
    a: array[0..1] of Integer;
begin
  SetLength(Arr1,6);
  Arr1[5] := 100;
  Arr2 := Arr1;                        // Arr2 引用了 Arr1
  ShowMessage(IntToStr(Arr2[5]));      // 100
  ShowMessage(IntToStr(Length(Arr2))); // Arr2 维数也会是 6

  ShowMessage(IntToStr(SizeOf(Arr1))); //4, 其实动态数组是个指针
  ShowMessage(IntToStr(SizeOf(Arr2))); //4

  Arr2[5] := 99; //现在它们指向同一个数组, 改变这个就是改变那个
  ShowMessage(IntToStr(Arr1[5])); //99

  Arr1 := nil; //释放其中一个指针, 数组继续存在
  ShowMessage(IntToStr(Arr2[5]));     // 99
end;
--------------------------------------------------------------------------------

//例4. 数组 Copy <1>:
var Arr1,Arr2: array of Integer;
begin
  SetLength(Arr1,6);
  Arr1[5] := 100;
  Arr2 := Copy(Arr1);             // 数组 Copy
end;
--------------------------------------------------------------------------------

//例5. 数组 Copy <2>:
var
Arr1,Arr2: array of Integer;
i: Integer;
begin
  SetLength(Arr1,6);
  for i := Low(Arr1) to High(Arr1) do // 给每个元素赋值
  Arr1[i] := i+1;
  Arr2 := Copy(Arr1,1,3);             // Copy 下标2开始,共3个 即第2..4个元素
end;
--------------------------------------------------------------------------------

//例6. 变体数组(伴有效率问题)
var Arr: array of Integer;
begin
  Arr := varArrayCreate([0,3],varInteger);
  ShowMessage(IntToStr(Length(Arr))); 
  Arr := VarArrayOf([1,2,3,4]);
  ShowMessage(IntToStr(Arr[0])); 
end;
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值