asp定义数组详解数组是有序数据的集合。数组中的元素可以不属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素,更改其中一个元素并不会影响其它元素。数组的下标是有界的,分为下界和上界。数组可以用Dim、Private、Public或Static来声明,它们的语法格式相同。下面只介绍用Dim声明数组的方法。1.数组的定义与声明数组的定义语法如下:Dim数组名([[下标下界To]下标上界])[As数据类型]例如(假设在当前模块中数组的缺省下界为0)):①DimA(10)AsInteger表示数组名为A,此数组下标下界为缺省值0,下标上界为10,有11个Integer类型的元素,从A(0)、A(1)到A(10)。②DimB(1To20)AsInteger表示数组名为B,此数组下标下界为1,下标上界为20,有20个Integer类型的元素,从B(1)到B(20)。③DimDayArray(50)表示DayArray是一个有51个索引(从0到50)元素的Variant数组。④DimMatrix(3,4)AsInteger表示Matrix是一个二维Integer数组。⑤DimMyMatrix(1To5,4To9,3To5)AsDouble表示MyMatrix是一个显式指定了上下界的三维double数组。⑥DimBirthDay(1To10)AsDate表示BirthDay是一个索引从1到10的Date型数组。2.OptionBase语句OptionBase语句在模块级别中使用,用来声明数组下标的缺省下界。OptionBase语句的语法如下:OptionBase{0|1}说明:缺省状态下数组下界为0,此时无需使用OptionBase语句。如果使用该语句规定数组下界1,则必须在模块的数组声明之前使用OptionBase语句。注意:(1)Dim、Private、Public、ReDim以及Static语句中的To子句提供了一种更灵活的方式来控制数组的下标。不过,如果没有使用To子句显式地指定下界,则可以使用OptionBase将缺省下界设为1。使用Array函数创建的数组的下界也受OptionBase语句指定的下界的决定,除非Array是由类型库(例如VBA.Array)名称限定,如果是由类型库名称限定,则使用Array函数创建的数组的下界不受OptionBase的影响。(1)OptionBase语句只影响位于包含该语句的模块中的数组下界。关于数组声明的几点说明:①数组名命名规则和变量名的相同。②数组名后是用圆括弧括起来的,不能用方括弧,不同于C语言。③下标的下界必须不能大于其上界。④可以用变量名或常数名(以及实数)作下标的边界。当下标的边界是常数名时,数组的大小固定,当下标的边界是变量名时,数组的大小可作动态定义,即数组的大小取决于程序运行过程中变量的值。因此,VB中数组又可以分为两种数组:静态数组、动态数组。3.静态数组静态数组是指数组元素的个数是固定不变的,即它们占用的内存空间大小是固定不变的。根据固定大小数组的维数不同,可以将它分为一维数组和多维数组。声明多维数组的语法格式为:Dim数组名([下标边界列表])[As数据类型]下标边界的定义形式:[下标下界To]下标上界下标边界列表指用逗号分开的数组各维的下标边界,即[下标下界To]下标上界,[下标下界To]下标上界,……,[下标下界To]下标上界(第一维)(第二维)(第n维)当n=1时,数组称作一维数组;当n=2时,数组称作二维数组;依次类推,当n=m时,数组称作m维数组。下面举例介绍一维数组的使用。’声明一个长度为51的字符串数组FriendsNameDimFriendsName(50)AsString’声明一个长度为11的全局整型数组ClassPublicClass(10)AsInteger一维数组中的元素个数为(上界-下界+1)。为数组赋初值可以采用循环语句,如:DimIAsIntegerForI=0To11’循环语句的使用程序流程的控制C(I)=INextI如果不显式指定下标下界,则数组的下标下界由OptionBase语句控制。如果没有OptionBase语句则下界为默认为0。数组的维数并不限于2,在VB中,可以扩大至于60,在实际应用上对三维以上的数组的应用是不多的。定义一个多维数组时只需一条Dim语句指定数组的所有下标边界即可,使用多维数组的可以很方便的表示一些有意义的统计数据。例如:DimProfit(16,10,12)AsCurrency这个Profit数组可用来表示以店名、部门及月份为参数的某百货公司的利润。如:Profit(2,8,11)代表了第二分店的第八部门在11月份的利润。4.动态数组有时在数组开始使用前,不能知道需要多大的数组才能满足实际需要。当然可以把数组的大小定义到足够大来满足任意的实际应用需要,这种方法效率很低(大量浪费内存空间)。如果使用动态数组,就可以在程序运行时根据实际需要,精确定义数组的大小。在声明数组时,不给出维数列表就是将数组声明为动态数组。例如:DimMyArry()AsInteger在使用动态数组前,必须使用ReDim语句把它重新定义。如前面声明的数组MyArry,可以用以下语句将它定义为一个动态二维数组。ReDimMyArry(10,10)还可以通过重复执行ReDim语句,多次定义动态数组。使用ReDim最多能定义数组的维数是60。ReDim语句可以改变数组每维的元素个数,但不能改变维数。下面是对ReDim语句的一个标准应用举例。DimMyArry()AsSingle‘声明动态数组ReDimMyArry(30,20,10)‘重新定义数组ReDimMyArry(50,23,21)‘再次重新定义数组ReDim的语法与Dim的相同,此外,它还有选择项Preserve关键词:ReDimPreserve数组名([[下标下界To]下标上界])[As数据类型]例如:ReDimMyArry(50,23,21)ReDimPreserveMyArry(50,23,50)注意:使用ReDim时,重新定义数组会使所有数组元素的值消失,而使用Preserve可以保留数据。但是用Preserve只能在改变数组的最后一维的大小时,保留数组的数据。对于一维数组来说,所有数据都会保留,而对于多维数组:只能改变最后一维的大小,才能保留全部数组数据,否则出错。5.LBound函数和UBound函数LBound函数和Ubound函数都是返回一个Long型数据,前者得到的值为指定数组维可用的最小下标,而后者得到的是最大下标。它们的语法为:LBound(数组名[,指定的维数])UBound(数组名[,指定的维数])其中数组名是必选的。指定的维数是可选的,表明指定返回哪一维的下界。1表示第一维,2表示第二维,如此类推。如果省略指定的维数,就默认为是1。关于如何使用LBound函数与UBound函数可参见下例:DimA(1to100,3,-3to4)AsInteger’定义一三维数组,假定没有使用OptionBase语’句改变数组下界的默认值。对数组A使用Lbound和Ubound函数,其返回值列表如下所有维的缺省下界取决于OptionBase语句的设置。可以看出对一数组使用LBound函数与UBound函数,可用于确定一个数组中元素的个数。对于那些在声明中用To子句来设定维数的数组而言,它们可以用任何整数作为下界而不受OptionBase语句的限制。6.数组的高级功能尽管数组最通常被用来存储成组的变量,但是在别的一些方面数组也是很有用的。可以将一个数组的内容赋值给另一个数组、创建返回数组的函数,还可以创建返回数组的属性。在许多情况下,这些技术能改进应用程序的性能。正如可以将一个变量的值赋给另一个变量,例如StrA=StrB,也可以将一个数组的内容赋给另一个数组。例如,要将一字节型数组从一个位置复制到另一个位置。可以通过每次复制一个字节来实现,程序如下:SubByteCopy(oldCopy()AsByte,newCopy()AsByte)‘参数oldCopy()是源数组,newCopy()是目标数组DimiAsIntegerReDimnewCopy(Lbound(oldCopy)ToUBound(oldCopy))’重新定义动态数组Fori=Lbound(oldCopy)ToUbound(oldCopy)’循环赋值newCopy(i)=oldCopy(i)NextEndSub一个更有效的简单的方法就是直接将一个数组赋给另外一个数组:SubByteCopy(oldCopy()AsByte,newCopy()AsByte)‘参数oldCopy()是源数组,newCopy()是目标数组newCopy=oldCopy’利用数组直接进行赋值EndSub关于变量赋值有一些规则需要铭记。例如,虽然可以将一个声明为整型的变量赋给一个声明为长整型的变量而不会产生任何问题,但是将一个长整型变量赋给一个整型变量就很容易导致溢出错误。除了遵守有关数据类型变量之间赋值时的规则外,数组赋值还要遵从另外一些规则,包括数组维数,每一维的大小,以及数组是固定的还是动态的。①维数、数据类型不同的数组赋值考虑的几个因素l赋值符左边的数组类型:固定数组(Dimx(1to10)AsInteger)或者动态数组(Dimx()AsInteger)。l赋值符左边数组的维数是否和赋值符右边数组的维数匹配。l赋值符两边数组的每一维的数组元素个数是否匹配。即使数组的声明不同,维数也可能匹配。比如一个数组的每一维元素从0开始编号而另一个则从1开始,维数也可能匹配。l赋值符两边所有元素的数据类型必须是相容的。这些规则和变量赋值的规则是一致的。表3-6显示了这些因素的影响:数组赋值时的错误可能发生在编译时,也可能发生在运行时(例如,如果数据类型不能强制转换或赋值试图重新声明(ReDim)一个静态数组)。设计程序时要添加错误处理以确保数组在赋值之前是匹配的。②编写返回数组的函数从一个函数返回一组值是可能实现的。例如,从一个函数返回一组字节而不必将其先转换为一个字符串然后再转换回来。下面是一个使用返回字节数组的函数的简单示例:PrivateSubForm_Load()DimbAsByteDimiAsIntegerDimReturnArray()AsByteb=Cbyte(54)ReturnArray()=ArrayFunction(b)’调用函数Fori=Lbound(ReturnArray)ToUbound(ReturnArray)MsgboxReturnArray(i)’通过弹出消息框循环显示数组值NextEndSubPublicFunctionArrayFunction(bAsByte)AsByte()Dimx(2)AsBytex(0)=bx(1)=b+CByte(200)x(2)=b+bArrayFunction=x’返回结果为数组xEndFunction在运行以上示例后,ReturnArray()是一个三元素数组,其中包含了分配给ArrayFunction中数组的值。ArrayFunction语句将一个数组作为参数传递;且数组的数据类型必须和函数的数据类型相同(在本例中是字节)。因为这是一个函数调用,传递数组时不必带括号。注意:1.尽管可以通过赋值给另一个数组(ArrayFunction=x())来返回一个数组,但出于性能方面的考虑,并不推荐使用这种方法。2.必须为返回数组的函数指定一个类型,这个类型可以是Variant。这样一来,FunctionX()AsVariant()是有效的而FunctionX()As()将失败。3.当调用一个返回数组的函数时,用来保存返回值的变量也必须是一个数组,而且其数据类型必须和函数返回类型相同,否则将显示一个“类型不匹配”的错误。