5.6  动态数组

5.6 动态数组

数组定义后,为了使用数组,必须为数组开辟所需要的存储区。根据内存区开辟的时机不同,可以把数组分为静态(Static)数组和动态(Dynamic)数组。在前面定义数组时,都给出了数组下标的上界和下界。这样的数组定义后,数组的大小也就确定了,不能再修改数组的大小,需要在编译时开辟内存区。但有时可能无法事先知道数组到底应该有多大才合适,只有在程序运行时才能根据运行状况决定数组的大小,这就需要在程序运行时动态改变数组的大小,即在程序运行时开辟内存区。

通常,把需要在编译时开辟内存区的数组称为静态数组,而把在程序运行时开辟内存区的数组称为动态数组。

前面的例子用的都是静态数组,是用数值常量或符号常量作为下标定维的数组。下面介绍动态数组。

建立动态数组的方法:首先在窗体层、标准模块或过程中使用Dim、Private或Public语句声明一个没有下标的数组,即括号内为空的数组,然后在过程中用ReDim语句重新定义数组的大小。

ReDim语句的语法格式如下。

978-7-111-49659-5-Chapter05-92.jpg

说明:

1)ReDim语句只能出现在过程中,否则会出现错误。

2)静态数组中对应数组下标上界和下界的声明必须使用常量,而用ReDim语句定义动态数组时,可以使用变量定义下标上界和下界。例如:

978-7-111-49659-5-Chapter05-93.jpg

3)在过程中可以多次使用ReDim语句改变数组的大小,也可以改变数组的维数,但不能改变数组的数据类型。例如:

978-7-111-49659-5-Chapter05-94.jpg

如果把第2条语句写为ReDim a(30)As Single就会产生错误,因为改变了数组的数据类型。

4)使用ReDim语句重新定义数组的大小时,数组中的数据会丢失,新定义的数组中的各元素将被赋予一定的初值(例如,数值型数组初值为0,字符串数组初值为空串)。如果要在使用ReDim语句重新定义数组的大小时保留数组中的数据,则必须在ReDim语句后加Preserve关键字。使用Preserve关键字后将不能再改变数组的维数,同时也只能改变最后一维的大小,对于其他维数不能做任何修改。例如,如果执行下列语句:

978-7-111-49659-5-Chapter05-95.jpg

则使用“ReDim Preserve a(3,6)As Integer”语句是正确的,而不能使用“ReDim Preserve a(3)As Integer”语句,因为改变了数组的维数。使用“ReDim Preserve a(2,6)As Integer”语句也是错误的,因为只允许改变最后一维的大小,这里改变了第一维的大小。

5)使用Preserve关键字后,只能改变数组最后一维的上界。如果要改变下界,也将产生错误。例如:

978-7-111-49659-5-Chapter05-96.jpg

【例5-14】输入一个正整数n,产生n个1~100的随机数,并保存在数组中。完整代码如下。

978-7-111-49659-5-Chapter05-97.jpg

978-7-111-49659-5-Chapter05-98.jpg

运行结果如图5-14所示。

978-7-111-49659-5-Chapter05-99.jpg

图5-14 动态数组示例