FB语言中所有变量都存储在内存中,而存放变量特定内存单元的编号就称为地址,输入并运行以下代码:
Sub 游戏执行过程(hWndForm As hWnd)
Dim a As Long
a = 1
Print a
Print @a
End Sub
程序运行后输出
1
54394640
其中@称为取地址运算符,@a即为变量a的地址。注意,每次运行时,程序为变量a分配的地址可能不一样。54394640 的数字每次运行都会不同
为了处理地址,我们可以定义一类特殊的变量——指针(变量):
Sub 游戏执行过程(hWndForm As hWnd)
Dim a As Long =1
Dim p As Long Ptr
p=@a
Print @a
Print p
Print a
Print *p
End Sub
程序运行后输出:
54394640
54394640
1
1
其中,Dim p As Long Ptr定义了指针变量p,Ptr 表示为指针变量,Long 表示p可以记录整型变量的地址。
p = @a 将变量a的地址赋给指针p,这样p就指向a所在的内存空间。因此print @a 和print p 输出同样的结果。
printf *p *为取内容运算符,表示取p指向的内存空间的内容,即为a的值1。
同一般变量一样,指针变量之间也可以相互赋值:
Sub 游戏执行过程(hWndForm As hWnd)
Dim a As Long
Dim p As Long Ptr ,q As Long Ptr
p = @a
q=p
*q = 2
Print a
Print *p
Print *q
End Sub
经过赋值后,指针变量p、q均指向整型变量a。因此通过q=2赋值后,a、p的值也变成2,程序输出:
2
2
2
利用指针,我们可以在调用函数时修改实际参数的值:
Sub fun(a As Long Ptr)
*a = *a + 1
End Sub
Sub 游戏执行过程(hWndForm As hWnd)
Dim x As Long = 1
Print x
fun(@x)
Print x
End Sub
程序运行后输出:
1
2
运行fun(@x),将变量x的地址传递给形式参数a。a即为实际参数x的地址。在fun()函数中通过*a修改x的内存空间,返回到主函数后,x的值也改变了。
和8.4节中讲解的值调用不同,这种参数传递方式称为地址传递。
提示
使用指针可以减少全局变量的使用,使得程序更加模块化。比如,将全局变量改为函数内部的局部变量,当需要调用其他函数修改变量值时,可以利用地址传递的方式。
除了利用地址传递外,我们还可以利用引用传递在调用函数时修改实际参数的值:
Sub fun(ByRef a As Long)
a = a + 1
End Sub
Sub 游戏执行过程(hWndForm As hWnd)
Dim x As Long = 1
Print x
fun(x)
Print x
End Sub
程序运行后输出:
1
2
Sub fun(ByRef a As Long)中的 ByRef 表示引用传递,a相当于是实际参数x的一个别名,在fun()函数中修改a的值,游戏执行过程()函数中实际参数x的值也随之变化。
评论一下?