ZetCode

FreeBasic @ 运算符

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 @ 运算符是地址运算符,它返回变量的内存地址。它对于在 FreeBasic 中使用指针和低级内存操作至关重要。

基本定义

在 FreeBasic 中,@ 运算符位于变量名前面,并返回其内存地址。此地址可以存储在指针变量中,以便以后访问或操作原始变量。

地址运算符对于指针算术、按引用传递变量以及与需要内存地址的外部库交互至关重要。它提供了对内存位置的直接访问。

获取变量地址

此示例显示了如何获取和显示变量的内存地址。

address_of_basic.bas
Dim number As Integer = 42
Dim numberPtr As Integer Ptr = @number

Print "Value of number: "; number
Print "Address of number: "; numberPtr
Print "Value via pointer: "; *numberPtr

在这里,我们声明一个整数变量并通过 @ 获取其地址。我们将此地址存储在整数指针中。该示例展示了如何访问原始值以及通过指针访问的值。

按引用传递变量

地址运算符能够将变量按引用传递给过程。

address_of_reference.bas
Sub DoubleValue(ByRef valuePtr As Integer Ptr)
    *valuePtr *= 2
End Sub

Dim value As Integer = 5
Print "Original value: "; value

DoubleValue(@value)
Print "Doubled value: "; value

此示例将变量的地址传递给一个修改原始值的子例程。@ 运算符获取地址,子例程使用指针解引用来更改该地址处的值。

数组地址操作

地址运算符可与数组元素一起使用以获取其位置。

address_of_array.bas
Dim numbers(4) As Integer = {10, 20, 30, 40, 50}
Dim elementPtr As Integer Ptr = @numbers(2)

Print "Third element: "; numbers(2)
Print "Address of third element: "; elementPtr
Print "Value via pointer: "; *elementPtr

这演示了如何获取特定数组元素的地址。然后可以使用指针通过内存操作直接访问或修改该数组元素。

结构体地址操作

地址运算符可与结构体变量及其成员一起使用。

address_of_struct.bas
Type Person
    name As String
    age As Integer
End Type

Dim user As Person
user.name = "Alice"
user.age = 30

Dim agePtr As Integer Ptr = @user.age

Print "Original age: "; user.age
*agePtr = 31
Print "Modified age: "; user.age

在这里,我们获取结构体成员的地址并通过指针修改它。当处理复杂的数据结构而直接成员访问可能受限时,此技术很有用。

指针算术

使用 @ 获取的地址可用于指针算术。

address_of_arithmetic.bas
Dim values(3) As Integer = {100, 200, 300, 400}
Dim basePtr As Integer Ptr = @values(0)

For i As Integer = 0 To 3
    Print "Value "; i; ": "; *(basePtr + i)
Next

此示例展示了如何使用指针算术遍历数组。@ 运算符获取基地址,我们添加偏移量来访问后续元素。这是数组索引的一种低级替代方法。

函数指针参数

地址运算符可以将变量传递给期望指针的函数。

address_of_function.bas
Function SumValues(a As Integer Ptr, b As Integer Ptr) As Integer
    Return *a + *b
End Function

Dim x As Integer = 15
Dim y As Integer = 25

Print "Sum: "; SumValues(@x, @y)

在这里,我们将变量的地址传递给一个使用指针的函数。该函数解引用指针以访问原始值。这避免了在将大型数据结构传递给函数时复制它们。

与外部库的互操作性

在调用外部库函数时,地址运算符至关重要。

address_of_external.bas
' Example using Windows API function
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
    (hWnd As Integer, lpString As String, nMaxCount As Integer) As Integer

Dim hWnd As Integer = 12345 ' Example window handle
Dim buffer As String = Space(256)

GetWindowText(hWnd, buffer, 256)
Print "Window text: "; buffer

虽然此示例没有明确显示 @,但许多外部函数都需要内存地址。在需要时,将使用地址运算符将变量按引用传递给此类函数。

最佳实践

本教程涵盖了 FreeBasic @ 运算符,并通过实际示例展示了它在涉及内存地址的各种场景中的用法。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 FreeBasic 教程