VBA ByRef 在幕后是如何工作的?
How does VBA ByRef work behind the scenes?
假设我有一个采用整数值 ByRef 的函数,如下所示:
Function myFunc(ByRef funcVal As Integer)
funcVal = funcVal + 1
End Function
假设我这样称呼它:
Dim myVal as Integer
myVal = 5
Call myFunc(myVal)
据我了解,计算机已为我的 myVal
变量分配了 space,并将值 5 放入 space。当我调用 myFunc
时,计算机基本上将指向该位置的指针传递给 myFunc
,因此当 myFunc
递增 funcVal
时,它实际上是递增相同的位置,所以 myVal
也递增。
但是如果我这样调用 myFunc 会发生什么:
Call myFunc(5)
计算机是否仍然给 myFunc
一个指针,如果是,指向什么?或者它是否必须将一些新的 space 分配给 funcVal
(而不是像我之前的示例中那样使用与 myVal
相同的 space)?
我想这里还有一个相关的问题 - VBA 如何处理代码中的文字值?
非常感谢!
变量存储在内存地址。文字也是如此。程序也是如此。程序参数也是如此。
参数是局部范围的变量,它们与传递给过程的参数是不同的和独立的实体。 VB virtual machine 在 table.
中管理所有这些实体地址
当通过引用传递变量参数时,会将指针传递给关联的过程参数,这使参数可以直接访问调用变量地址的内存。
但是,文字本身显然是 immutable,因此当通过引用传递文字参数时,VM 被迫将文字复制到一个临时地址,这个新地址通过参考程序。这允许过程在执行期间使用和更新值而不影响过程外的原始文字值。
In essence literals are always passed by value and passing by value
actually means passing a pointer to a copy of the calling argument.
假设我有一个采用整数值 ByRef 的函数,如下所示:
Function myFunc(ByRef funcVal As Integer)
funcVal = funcVal + 1
End Function
假设我这样称呼它:
Dim myVal as Integer
myVal = 5
Call myFunc(myVal)
据我了解,计算机已为我的 myVal
变量分配了 space,并将值 5 放入 space。当我调用 myFunc
时,计算机基本上将指向该位置的指针传递给 myFunc
,因此当 myFunc
递增 funcVal
时,它实际上是递增相同的位置,所以 myVal
也递增。
但是如果我这样调用 myFunc 会发生什么:
Call myFunc(5)
计算机是否仍然给 myFunc
一个指针,如果是,指向什么?或者它是否必须将一些新的 space 分配给 funcVal
(而不是像我之前的示例中那样使用与 myVal
相同的 space)?
我想这里还有一个相关的问题 - VBA 如何处理代码中的文字值?
非常感谢!
变量存储在内存地址。文字也是如此。程序也是如此。程序参数也是如此。
参数是局部范围的变量,它们与传递给过程的参数是不同的和独立的实体。 VB virtual machine 在 table.
中管理所有这些实体地址当通过引用传递变量参数时,会将指针传递给关联的过程参数,这使参数可以直接访问调用变量地址的内存。
但是,文字本身显然是 immutable,因此当通过引用传递文字参数时,VM 被迫将文字复制到一个临时地址,这个新地址通过参考程序。这允许过程在执行期间使用和更新值而不影响过程外的原始文字值。
In essence literals are always passed by value and passing by value actually means passing a pointer to a copy of the calling argument.