VisualFreeBasic游戏趣味编程_10.8_地址与指针

2026-1-22 / 0 评论 / 76 阅读

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 @aprint 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的值也随之变化。

评论一下?

OωO
取消