称为
Any Ptr(或“
Any Pointer”)的特殊指针类型允许指向任何变量类型。如果您将其转换为
DataType Ptr,则可以索引或取消引用以访问内存,作为
DataType 的实例。指针算术允许在
Any Ptr上,并像
Byte Ptr一样对待:指针以
1的增量更改。
纯粹的
Any Ptr没有编译器的类型检查。它可以通过赋值或参数传递隐式转换为其他指针类型。
Any本身不是变量的有效数据类型。此外,取消引用
Any Ptr(尽管
Any Ptr Ptr可能被取消引用以生成
Any Ptr)是非法的。
这不应该与可以包含任何类型的变量的Visual Basic数据类型
Variant相混淆。FreeBASIC不提供
Variant类型的本地支持。
Any可以在具有
ByRef参数的过程原型(
Declare语句中)中使用,以禁用编译器检查传递的变量的正确类型。
Any的使用已被弃用,仅与QB兼容。
在数组声明中,可以指定
Any代替数组边界,以创建一个基于指定的
Any数量确定的一定维度的动态数组(使用
Any的语法)在
Type内声明一个动态数组成员时是强制的)。
在参数声明中,也可以指定
Any而不是空括号,以修正维度。
Any可以用作伪初始化器,以将变量的默认初始化禁用为
0,使变量未初始化。这可以节省程序的关键部分的时间。程序有责任在读取变量之前填写有意义的数据。
与C / C ++的比较:这与C / C ++中没有初始化值的变量声明的行为相匹配。
类似于
Any变量的初始化器,
Any也可以与
New或
Placement New运算符一起使用,以便将新创建的对象未初始化(仅允许使用不具有构造函数的数据类型)。
Declare Sub echo(ByVal x As Any Ptr) ''echo将接受任何指针类型
Dim As Integer a(0 To 9) = Any ''此变量未初始化
Dim As Double d(0 To 4)
Dim p As Any Ptr
Dim pa As Integer Ptr = @a(0)
Print "未初始化";
echo pa ''传递回指针到整数
Dim pd As Double Ptr = @d(0)
Print "初始化";
echo pd ''传递一个指针来回显一次
p = pa ''指定p指向整数的指针
p = pd ''赋值给一个指向double的指针
Sleep
Sub echo (ByVal x As Any Ptr)
Dim As Integer i
For i = 0 To 39
'echo将指针中的数据解释为字节
Print Cast(UByte Ptr, x)[i] & "";
Next
Print
End Sub
'任何禁用变量类型检查的示例
Declare Sub echo (ByRef a As Any) ''任何禁止检查传递给函数的数据类型
Dim x As Single
x = -15
echo x ''将单个传递给期望为整数的函数。编译器不抱怨!
Sleep
Sub echo (ByRef a As Integer)
Print Hex(a)
End Sub
Dim a(Any) As Integer '一维动态数组
Dim b(Any, Any) As Integer '二维动态数组
Dim c(Any, Any, Any) As Integer '3维动态数组
'等等
'进一步的Redims或数组访问必须具有匹配的维数
ReDim a(0 To 1) As Integer
ReDim b(1 To 10, 2 To 5) As Integer
ReDim c(0 To 9, 0 To 5, 0 To 1) As Integer