VBA ByRef 在幕后如何工作?

Bru*_*uce 3 vba

假设我有一个采用 Integer 值 ByRef 的函数,如下所示:

Function myFunc(ByRef funcVal As Integer)
  funcVal = funcVal + 1
End Function
Run Code Online (Sandbox Code Playgroud)

假设我这样称呼它:

Dim myVal as Integer
myVal = 5
Call myFunc(myVal)
Run Code Online (Sandbox Code Playgroud)

据我了解,计算机已为我的myVal变量分配了空间,并将值 5 放入该空间中。当我调用 时myFunc,计算机基本上会将指向该位置的指针传递给myFunc,因此当myFunc递增 时funcVal,它实际上是在递增同一位置,因此myVal也递增。

但是如果我像这样调用 myFunc 会发生什么:

Call myFunc(5)
Run Code Online (Sandbox Code Playgroud)

计算机是否仍然给出myFunc一个指针,如果是,则指向什么指针?或者它是否必须分配一些新空间funcVal(而不是像myVal我之前的示例中那样仅使用相同的空间)?

我想这里还有一个相关的问题 - VBA 如何处理代码中的文字值?

非常感谢!

Exc*_*ero 5

变量存储在内存地址处。文字亦如此。程序也是如此。程序参数也是如此。

参数是局部作用域的变量,它们与传递给过程的参数是不同且独立的实体。VB虚拟机在一个表中管理所有这些实体地址。

当通过引用传递变量参数时,指针将传递到关联的过程参数,这使参数可以直接访问调用变量地址的内存。

然而,文字本身显然是不可变的,因此当文字参数通过引用传递时,虚拟机被迫将文字复制到临时地址,并且这个新地址通过引用传递给过程。这允许过程在执行期间使用并更新该值,而不影响过程外部的原始文字值。

本质上,文字总是按值传递,按值传递实际上意味着传递一个指向调用参数副本的指针。