按byval形式传递一个变量的地址与按byref传递这个变量本身等效吗

按byval方式传递一个变量的地址与按byref传递这个变量本身等效吗
vb6.0中按byval方式传递一个变量的地址与按byref传递这个变量本身等效吗?为什么?
------解决方案--------------------
等效与否这个的具体问题具体分析
就两者而言,含义是不同的,Byval是传值,也就是传递变量的一个副本;而Byref是传引用,也就是把地址传过去。
------解决方案--------------------
最好能分别讨论这个变量为long类型和string类型时的情况
------解决方案--------------------
假设这个变量叫X,是long类型
①byval x 时,vb会自动创建X的替身x1,然后将x1的地址返回给实参(完成外部变量与函数内部变量的对接,类似“索引”),函数对实参的操作实际是对x1的操作,x本身没有变化。
②byref x 时,vb会直接将x的地址返回给实参,函数对实参的操作实际是对x本身的操作。

请问上面两条推论成立吗?
------解决方案--------------------
vb6.0中按byval方式传递一个变量的地址:错误,传递是值
按byref传递才是变量的地址

函数或过程的参数传递需要通过栈,栈是函数调用者和函数内部能够知道的内存地址,是一种调用约定,调用者和被调用者能够准确的理解每个栈内存属于哪个变量。
调用的时候,ByVal则将对应的参数值复制到某个栈内存;ByRef的时候,则将该变量的地址复制到栈内存
------解决方案--------------------
以下摘自MSDN
Byval
按值
一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。


Byref
按地址
一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。

------解决方案--------------------
worldy
我们的理解似乎有些误差。我的意思是
vb6.0中按byval方式传递一个“变量的地址”
“变量的地址”本身也是一个变量(可以想成是一个临时变量)假设为a,a代表了那个变量的地址,可以用取地址函数取到值赋值给a。

------解决方案--------------------
worldy你好

“函数或过程的参数传递需要通过栈...”
是怎么理解的,能不能分享下
------解决方案--------------------
引用:
vb6.0中按byval方式传递一个变量的地址与按byref传递这个变量本身等效吗?为什么?

等不等效,没那么简单!看你怎么用了。比如:在ActiveX DLL中,如果DLL有一个参数声明成ByRef,则这个参数是可以返回值给调用DLL的主程序的;如果这个参数声明成ByVal,则不能返回值给主程序。
API函数VarPtr是返回变量的地址,为了获取字符串的指针,而非保存字符串的变量的指针,只须在变量名前加上ByVal即可:VarPtr(ByVal S)(相当于StrPtr(S),但不等于VarPtr(S))。
举个例子:
Dim S As String
S = "****"
Debug.Print VarPtr(S), VarPtr(ByVal S), StrPtr(S) '在我的电脑里面结果分别为1307680、1847644、1847644
这里有个详细例子,看完之后就明白了:http://topic.****.net/u/20090901/09/dddf35aa-7838-4415-85b2-222358422d81.html
------解决方案--------------------
引用:
worldy
我们的理解似乎有些误差。我的意思是
vb6.0中按byval方式传递一个“变量的地址”
“变量的地址”本身也是一个变量(可以想成是一个临时变量)假设为a,a代表了那个变量的地址,可以用取地址函数取到值赋值给a。


你的意思是以Byval方式来传递一个地址,比如通过VarPtr获得地址传递?如果是这样
VB的自定义函数肯定不等效,因为被调用者(函数或过程)在编译的时候,是按照定义时候按值或者按地址编译的,调用者如果使用ByVal 或者Byref修改调用的参数,对于内部函数将会出现编译错误。

API调用,byval的声明参数,一般是不可以使用Byref进行强制
但是Byref声明的参数,在一些时候可以使用ByVal进行强制,比如你先获得Varptr

不知道说的对不对
------解决方案--------------------
说了一堆... 
都什么啊.......

对lz问题的回答: 等效 ...

因为vb这种高级语言,掩盖的东西太多了,导致看起来似乎不一样,其实是一样的
按照lz说的方法传过去后,参数都是一样的值, 只不过必须通过特殊方法来证明,

比如 byval 的直接 msgbox 参数, byref的 copymemory a,参数,4 然后再 msgbox a
如果相等就说明等效了, 其实根本就是等效的, 上面那些说了一堆的都没用, 只会让人越看越迷糊


------解决方案--------------------
PctGL
可不可以说的再详细点

------解决方案--------------------
PctGL
copymemory的第二个参数(设为变量b),copymemory函数内部用到的是b的内存地址,而不是b的值,是吗?感觉这里面被VB代劳的工作特别多,认识比较吃力
------解决方案--------------------
PctGL
设:
一个Long型变量为A,其内存地址ad=108,其va=1008。
那么:
任何一个使用他作为参数的函数(如:msgbox、copymenory...),无非使用以下两种方式传参。