ZetCode

FreeBasic 解引用运算符 (*)

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

FreeBasic 的 * (解引用) 运算符访问由指针指向的内存地址中存储的值。它是直接内存操作和高效数据结构的基础。

基本定义

在 FreeBasic 中,* 运算符有两个用途:声明指针变量和解引用指针。当用作指针变量的前缀时,它会访问指针地址处的值。

解引用对于使用动态内存分配、按引用传递参数和实现复杂数据结构至关重要。它在保持类型安全的同时提供底层内存访问。

基本解引用

此示例显示了解引用运算符的基本用法。

basic_dereference.bas
Dim x As Integer = 42
Dim ptr As Integer Ptr = @x

Print "Value of x: "; x
Print "Address of x: "; ptr
Print "Value at ptr: "; *ptr

在这里,我们创建一个整数变量 x 和一个指向它的指针。@ 运算符获取 x 的地址。*ptr 解引用指针以访问 x 的值。这演示了通过指针进行直接内存访问。

通过解引用修改

解引用允许修改指针地址处的值。

modify_dereference.bas
Dim value As Integer = 10
Dim pValue As Integer Ptr = @value

Print "Original value: "; value
*pValue = 20
Print "Modified value: "; value

此代码通过其指针间接修改 value*pValue = 20 行会更改 pValue 地址处的值。这表明了解引用如何实现间接变量修改。

指向指针的指针

解引用适用于多级间接。

pointer_to_pointer.bas
Dim num As Integer = 100
Dim pNum As Integer Ptr = @num
Dim ppNum As Integer Ptr Ptr = @pNum

Print "num: "; num
Print "*pNum: "; *pNum
Print "**ppNum: "; **ppNum

在这里,我们创建一个指向指针的指针。双重解引用 **ppNum 首先获取 pNum,然后解引用该指针以获取 num。这演示了 FreeBasic 中的多级指针解引用。

解引用结构指针

解引用运算符适用于结构指针。

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

Dim p As Person
Dim pPtr As Person Ptr = @p

*pPtr = Type("Alice", 30)
Print "Name: "; (*pPtr).name
Print "Age: "; (*pPtr).age

此示例显示了解引用结构指针。我们在 *pPtr 周围使用括号来正确限定解引用,然后再访问成员。箭头运算符 -> 通常更适合此操作。

箭头运算符与解引用

箭头运算符结合了解引用和成员访问。

arrow_operator.bas
Type Point
    x As Integer
    y As Integer
End Type

Dim pt As Point
Dim pPt As Point Ptr = @pt

pPt->x = 10
pPt->y = 20

Print "Point: ("; pPt->x; ", "; pPt->y; ")"
Print "Equivalent to: ("; (*pPt).x; ", "; (*pPt).y; ")"

箭头运算符 ->(*ptr).member 的语法糖。它使结构指针访问更简洁。此处显示了两种形式以供比较。为了提高可读性,通常首选箭头形式。

解引用数组指针

可以通过指针解引用来访问数组元素。

array_dereference.bas
Dim arr(3) As Integer = {10, 20, 30, 40}
Dim pArr As Integer Ptr = @arr(0)

For i As Integer = 0 To 3
    Print "arr["; i; "] = "; *(pArr + i)
Next

这演示了通过指针算术和解引用来访问数组。*(pArr + i) 等同于 arr(i)。指针算术会自动按类型大小进行缩放。这显示了底层数组访问。

解引用函数指针

函数指针可以被解引用以调用函数。

function_pointer.bas
Function Add(a As Integer, b As Integer) As Integer
    Return a + b
End Function

Dim pFunc As Function(a As Integer, b As Integer) As Integer Ptr = @Add

Print "5 + 7 = "; (*pFunc)(5, 7)

在这里,我们创建一个函数指针并通过解引用来调用它。(*pFunc)(5, 7) 语法调用 pFunc 指向的函数。这表明函数指针如何实现动态分派。

最佳实践

本教程介绍了 FreeBasic 解引用运算符,并通过实际示例展示了其在不同场景下的用法。

作者

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

列出所有 FreeBasic 教程