Delphi之数组
Object Pascal中可以建立丰富的数据类型。数组毫无疑问也是众多自定义数据类型中的一种。
Type
TA = array[0..9] of Integer;
...
var
A : TA;
和下面这段代码通常效果是相同的(不同的地方在类型篇再说)
var
A : Array [0..9] of Integer;
这相当于C中的
int A[10];
或Basic中的
Dim A(9) as Long或 Dim A(0 to 9) as Long
下面将分几个方面讲OP的数组:
多维数组:
多维数组的本质其实就是数组之数组。
type
TA = array[0..9] of array [0..9] of Integer;
TB = array[0..9, 0..9] of Integer;
TCA = array[0..9] of Integer;
TC = array[0..9] of TCA;
在这里TA,TB,TC是等价的。在使用时是没有分别的。例如X[0][0]:=1;Tx[0,0]:=1;(X是TA、TB、TC类型)
都是合法的。因为这几种类型都是在内存中开辟一块100x100xSizeOf(Integer)的区域,你根本无法区
分他是如何申请的,也没有必要去区分。
多维数组如何取得维数呢?
前面已经说过多维数组就是数组之数组,所以可以利用下面的方法来取得多维数组的维数:
var
k:array[2..10,3..20]of integer;
begin
showmessage(Inttostr(Low(k))+' '+Inttostr(High(k)));
showmessage(Inttostr(Low(k[Low(K)]))+' '+Inttostr(High(k[Low(K)])));//k[n]是array[3..20] of integer;的数组
end;
动态数组:
OP中动态数组的声明是
type
TA=Array of Integer;
动态数组应用中十分广泛。现在有一种趋势就是在数据结构中用动态数组代替链表
(到底哪个好哪个坏自有评价我们在这里不予以讨论)。
可能你会说动态数组根本不必要使用,我就从来没有用过。 我不信你没有用过动态数组!
String类型你用过吧,它近似可以说是动态数组的一种。
动态数组的内存是在使用分配长度时才予以分配的,他的下界只能0(AnsiString字符串例外,下界是1,原因后面再说),
动态数组的生存期是自管理的使用后一般不用释放,如果要强行释放就用把Nil附给他。
使用动态数组往往爱犯的错误:
1)和静态数组概念混淆:
动态数组的地址并不是他第一个元素的地址,而在静态数组中我们大家常常使用这样的语句:
var
A, B : array[0..19] of Integer;
...
CopyMemory(@A, @B, 20*SizeOf(Integer));
或者CopyMemory(@A[0], @B[0], 20*SizeOf(Integer));
都是正确的,因为静态数组中数组的首地址就是他第一个元素的地址。
但是在动态数组中只有第二种写法会得到正确结果。即只能写成:
var
A, B : array of Integer;
...
SetLength(A, 20);
SetLength(B, 20);
CopyMemory(@A[0], @B[0], 20*SizeOf(Integer));
2)数组的附值:
静态数组中的附值很简单
var
A, B : array[0..19] of Integer;
...
&nbs
[1] [2] [3] [4] [5] [6] 下一页