Skip to content

使用引用


声明引用及用引用代替指针的语法。

前言:

用于声明引用的不同语法均使用 'Byref' 关键字。

由于指针是一个变量,可以修改其内容,同一指针可以依次访问不同的变量。而引用与其所指对象之间的关联在声明时即固定。

'Byref' 关键字表示通过引用声明的变量,在三种不同的上下文中使用:

  • 在过程签名中,以引用方式传递参数(byref 参数)。

  • 在函数签名中,以引用方式向调用者返回变量(byref 返回)。

  • 在代码体中,定义引用变量(byref 变量)。

目录

1. 向过程传递引用参数(byref 参数)

2. 从函数按引用返回变量(byref 返回)

3. 在代码中定义引用变量(byref 变量)

4. 引用与指针的对比示例

5. 利用 FreeBASIC 允许的附加语法对引用用法进行扩展


1. 向过程传递引用参数(byref 参数)

  • 声明语法:
  • 按引用传递参数的完整语法示例:

注意:如果在实参前指定 Byval 关键字,指针可以直接(不先解引用)传递给 Byref 过程参数。

返回顶部


2. 从函数按引用返回变量(byref 返回)

  • 声明语法:
  • 按引用返回变量的完整语法示例:

特殊语法:

在使用 '=' 符号的赋值表达式左边,当函数调用只有一个参数时,按引用返回的函数结果必须用括号括起来,以解决解析歧义。

从 fbc 版本 0.90 起,可以使用 '=>' 代替 '=' 进行赋值(与初始化器相同),从而避免解析歧义(无需括号):

start GeSHi

vb
Declare Function transitbyref( ByRef _s As String ) ByRef As String

Dim As String s

s = "abcd"
Print s

'' 此处必须加括号。
( transitbyref( s ) ) = transitbyref( s ) & "efgh"
Print s

'' 此处不需要加括号。
transitbyref( s ) => transitbyref( s ) & "ijkl"
Print s

Sleep

Function transitbyref( ByRef _s As String ) ByRef As String
    '' 该可变长字符串将按引用传递(输入和输出),不会创建副本。
    Return _s
End Function

end GeSHi

输出:

abcd
abcdefgh
abcdefghijkl

注意:如果在 identifier=Function=Return 语句中的指针名前指定 Byval 关键字,指针可以直接(不先解引用)作为 Byref 函数返回值返回。

返回顶部


3. 在代码中定义引用变量(byref 变量)

  • 声明语法:
  • 在代码中定义引用变量的完整语法示例:

返回顶部


4. 引用与指针的对比示例

  • 返回两个整数变量中较大值的函数:
  • 带有覆盖子程序和带协变返回的覆盖函数的继承结构:

返回顶部


5. 利用 FreeBASIC 允许的附加语法对引用用法进行扩展

在 FB 中,引用通过保存变量地址的内部指针来实现。

目前允许用户对此内部指针进行读取访问,对于引用变量(与许多其他语言不同)还允许写入访问:

  • 因此,可以通过对引用变量符号名使用 '@' 运算符来获取被引用变量的地址(内部指针的值):

variable_address = @ref

  • 甚至可以通过修改内部指针的值,将引用变量重新赋值(reassigned)为指向另一个(兼容类型的)变量:

@ref = @other_variable

  • 甚至可以获取引用变量内部指针的地址:

internal_pointer_address = @@ref

注意:

  • 引用变量也可以重新初始化为"空"引用:

@ref = 0

  • 引用变量甚至可以直接声明为"空"引用:

Dim Byref As datatype ref = *Cptr(datatype Ptr, 0)

因此,通过始终使用相同的引用符号名,可以将对引用的纯语法与对其内部指针的语法混合使用。

  • 对引用符号名进行扩展操作的示例:

返回顶部


参见

  • Byref (parameters), Byref (function results), Byref (variables)
  • Operator @ (Address of), Operator * (Value of)
  • 从指针到引用

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系