使用引用
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgReferences
- 最后更新: 2021-08-31
声明引用及用引用代替指针的语法。
前言:
用于声明引用的不同语法均使用 'Byref' 关键字。
由于指针是一个变量,可以修改其内容,同一指针可以依次访问不同的变量。而引用与其所指对象之间的关联在声明时即固定。
'Byref' 关键字表示通过引用声明的变量,在三种不同的上下文中使用:
在过程签名中,以引用方式传递参数(byref 参数)。
在函数签名中,以引用方式向调用者返回变量(byref 返回)。
在代码体中,定义引用变量(byref 变量)。
目录
5. 利用 FreeBASIC 允许的附加语法对引用用法进行扩展
1. 向过程传递引用参数(byref 参数)
- 声明语法:
- 按引用传递参数的完整语法示例:
注意:如果在实参前指定 Byval 关键字,指针可以直接(不先解引用)传递给 Byref 过程参数。
2. 从函数按引用返回变量(byref 返回)
- 声明语法:
- 按引用返回变量的完整语法示例:
特殊语法:
在使用 '=' 符号的赋值表达式左边,当函数调用只有一个参数时,按引用返回的函数结果必须用括号括起来,以解决解析歧义。
从 fbc 版本 0.90 起,可以使用 '=>' 代替 '=' 进行赋值(与初始化器相同),从而避免解析歧义(无需括号):
start GeSHi
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 Functionend 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)- 从指针到引用
返回 目录