静态数组的定义方法
声明数组需要通过保留字 array 和 of 进行声明:
//1. 标准方法: var MyArr: array[0..10] of Integer; //定义静态数组 //2. 可以使用非0下标: var MyArr: array[9..10] of Integer; //不能提倡,这样不容易与系统函数沟通 //3. 根据预定义类型来声明数组: type TMyArr = array[0..10] of Integer; //先定义一个数组类型 var MyArr: TMyArr; //再定义静态数组 //4. 在非过程区可以直接赋值: var MyArr: array[0..2] of Integer = (11,22,33); //5. 多维数组: var MyArr: array[0..2, 0..2] of Integer; begin //使用 MyArr[1,2] := 100; end; //6. 根据子界定义数组: type TRange = 0..10; var MyArr: array[TRange] of Integer;
使用类型定义:
//7. 根据枚举定义数组: type TEnums = (Enum1,Enum2,Enum3); var MyArr: array[TEnums] of string; begin MyArr[Enum1] := '十月'; ShowMessage(MyArr[Enum1]); //十月 end; //8. 根据其他类型定义数组: var MyArr: array[Byte] of Char; begin MyArr[255] := #65; ShowMessage(MyArr[255]); //A end; //应尽量不使用内建类型,可以新建类型: type TNewByte = Byte; var MyArr: array[TNewByte] of Char; begin MyArr[255] := #65; ShowMessage(MyArr[255]); //A end; //也可以使用类型别名: type TChar = type Char; var MyArr: array[TChar] of Byte; begin MyArr['C'] := 255; ShowMessage(IntToStr(MyArr['C'])); //255 end;
定义记录类型数组:
//同时定义类型: type MyRec = record s: string; r: Real; b: Byte; end; var Arr1: array[0..100] of MyRec; Arr2: array[0..100] of record s: string; r: Real; b: Byte; end; //可以直接这样定义 Arr3: packed array[0..100] of MyRec; //压缩数组定义, 好像没有区别
动态数组的使用
动态数组的定义:
在后面定义的时候再写确定的大小。
//例1: var StrArr: array of String; //动态数组定义时不写维数 begin SetLength(StrArr,6); //分配6个元素位置大小: 0-5 StrArr[0] := '十七画生'; //动态数组的下界是 0 ShowMessage(StrArr[0]); //分配空间后和静态数组一样使用 StrArr := nil; //一般没必要手动释放, 动态数组离开作用域会自释放 end;
动态数组的引用:
这里是同一个数组,只不过可以由两个指针指向引用。
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;
动态多维数组:
只是简单的添加了一个array。
var Arr: array of array of Integer; //定义多维数组 begin SetLength(Arr,5,5); //分配空间 Arr[0,3] := 100; //赋值 ShowMessage(IntToStr(Arr[0,3])); //取值 end;
数组copy
全部复制:
这里与Delphi的数组引用有区别,区别实际上在于这里另外开辟了一块空间,里面内容一模一样。
var Arr1,Arr2: array of Integer; begin SetLength(Arr1,6); Arr1[5] := 100; Arr2 := Copy(Arr1); //数组 Copy Arr2[5] := 99; //改变 Arr2 不再影响 Arr1 ShowMessage(IntToStr(Arr1[5]-Arr2[5])); //1 SetLength(Arr1,7); ShowMessage(IntToStr(Length(Arr1))); //7 ShowMessage(IntToStr(Length(Arr2))); //6, 没有一点牵扯了 end;
切片范围复制:
这里可以控制复制的范围,可以分块复制,但是不能间隔几个元素复制。
代码如下:
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..4个元素 ShowMessage(IntToStr(Arr1[1])); //2, 现在 Arr2[0] 和 Arr1[1] 的值是一样的 ShowMessage(IntToStr(Arr2[0])); //2 ShowMessage(IntToStr(Length(Arr1))); //6, 维数肯定不一样了 ShowMessage(IntToStr(Length(Arr2))); //3 end;
运行结果展示:
检测数组的上、下界
当系统函数low,high的参数是数组变量时,两函数分别返回数组下标的下界和上界。
代码如下:
var Myarray: array of integer; i : Integer; begin SetLength(MyArray,10); for i:=Low(MyArray[i]) to High(MyArray[i]) do …… end;