发现文章标题:Delphi之动态数组使用总结
Delphi之动态数组使用总结
第一篇:delphi之动态数组使用总结delphi之动态数组使用总结
传统的pascal语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数。专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存。
delphi4中增加了非常简单的动态数组实现方法,实现过程效仿我前面讲过的动态长字符串。与长字符串一样,动态数组的内存动态分配并且引用记数,不过动态数组不支持copy-on-write技术。这不是个大问题,因为你可以把变量值设置为nil释放数组内存。
这样你就可以声明一个不指定元素个数的数组,并用setlength过程给数组分配一个特定大小的内存,setlength过程还可以改变数组大小而不影响其内容,除此外还有一些字符串过程也可用于数组,如copy函数。
以下摘录的代码突出了一点,这就是:定义数组后必须先为它分配内存,然后才能开始使用:
proceduretform1.button1click(sender:tobject);vararray1:arrayofinteger;beginarray1[1]:=100;//errorsetlength(array1,100);array1[99]:=100;//ok...end;如果你只定义一个数组元素个数,那么索引总是从0开始。pascal中的普通数组既能用不为零的下标,也能用非整数的下标,但动态数组均不支持这两种下标。象普通数组一样,你可以通过length、high和low函数了解到动态数组的状况,不过对于动态数组,low函数返回值总是0,high函数返回数组大小减1,这意味着空的动态数组其函数high返回值是-1,这是一个很怪的值,因为它比low的返回值还小。
图8.1:例dynarr窗体
以上作了简短的介绍,现在举个简例,例名dynarr,见图8.1。例子实在是很简单,其实动态数组没有什么特别复杂地方。我想通过该例说明几个程序员可能犯的错误。程序中声明了两个全程数组并在oncreate事件中初始化了第一个数组:
vararray1,array2:arrayofinteger;proceduretform1.formcreate(sender:tobject);begin//allocatesetlength(array1,100);end;这样就把数组所有值设置为0。完成这段代码你马上就能读写数组元素的值,而不用害怕内存出错,当然条件是你没有试图访问超过数组上界的元素。为了更好地初始化,程序中添加了一个按钮,执行数组元素赋值操作:proceduretform1.btnfillclick(sender:tobject);vari:integer;beginfori:=low(array1)tohigh(array1)do
array1[i]:=i;end;grow按钮用于修改数组大小,但并不影响数组内容。单击grow按钮后,你可以用getvalue按钮进行检验:
(未完,全文共3923字,当前显示1263字)
(请认真阅读下面的提示信息)