可变长数组 (Variable-length Arrays)
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgVarLenArrays
- 最后更新: 2021-12-09
可调整大小的同类数据结构,也称为"动态数组"。
概述
可变长数组是可以在程序执行期间调整大小以容纳更多或更少元素,或让其维度使用不同下标范围的数组。可变长数组用于存储元素的内存在堆上运行时分配,与固定长度数组不同——固定长度数组的数据分配在程序栈上或可执行文件的 .BSS 或 .DATA 段中(具体取决于是否使用 Static 或 Shared 定义)。
可变长数组也可以用作用户自定义类型内的数据成员。与固定长度数组不同,数组不会作为用户自定义类型结构的一部分被分配,因为用户自定义类型不能是可变长度的。相反,用户自定义类型只包含 FreeBASIC 在幕后用于管理可变长数组数据的数组描述符结构,数组仍然在堆上分配,与可变长数组变量相同。
可变长数组通常称为"动态数组",因为它们的大小可以在运行时动态变化,而不是固定大小。
声明
可变长数组使用 Dim 或 Redim 关键字声明,后跟变量标识符、括号中的边界列表和元素数据类型。要将数组声明为可变长,必须用未知边界或变量(非常量)边界来声明它。Redim 始终定义可变长数组,无论指定的边界是否为常量。
start GeSHi
'' 声明一个一维可变长整型数组,初始包含 2 个元素(索引 0 和 1)
ReDim a(0 To 1) As Integer
'' 声明一个一维可变长数组,不设初始边界。
'' 首次使用前必须通过 Redim 调整大小。
Dim b(Any) As Integer
'' 同上,但为二维数组
Dim c(Any, Any) As Integer
Dim myLowerBound As Integer = -5
Dim myUpperBound As Integer = 10
'' 通过指定变量(非常量)边界来声明一维可变长数组。
'' 数组将包含 myUpperBound - myLowerBound + 1 个元素。
Dim d(myLowerBound To myUpperBound) As Integer
'' 声明一个可变长数组,其维度数量由第一条 Redim 或数组访问语句决定。
'' 数组无初始边界,首次使用前必须通过 Redim 调整大小。
Dim e() As Integerend GeSHi
调整大小
调整可变长数组的大小是指以不同的边界"重新定义"数组,允许数组增长或缩小。超出新下标范围的元素将被删除;对象元素将被销毁。如果数组调整为更大的大小,则新元素以零或 null 值初始化;对象元素将被默认构造。可变长数组使用与定义相同形式的 Redim 关键字调整大小。在这种情况下,元素数据类型可以从 Redim 语句中省略。
start GeSHi
'' 定义一个空的一维 SINGLE 类型可变长数组...
Dim array(Any) As Single
'' 将数组大小调整为包含 10 个 SINGLE 类型元素...
ReDim array(0 To 9) As Single
'' 调整大小时可以省略数据类型:
ReDim array(10 To 19)end GeSHi
调整数组大小不能改变其维度数量,只能改变每个维度的边界。
默认情况下,调整大小时可变长数组的元素值会丢失。要在调整大小时保留以前的元素值,使用 Preserve 关键字。
参见
返回 目录