按值传递,按地址传递,你到底是哪样

微信公众号原文

系统:Windows 7
软件:Excel 2010

使用场景or困惑

  • 最近偶然发现一个问题,一个参数传递到子Sub过程后,在子Sub中进行完一波操作后,改变了该参数的值,返回到主过程中,该参数的对应值也变了
  • 这是为啥?不是默认按值传递参数吗,难道是按地址,还是按啥?一大波问号向我袭来
  • 其实一直以为默认是按值进行传递参数的(不知道这个默认从哪里来的),尴尬,原来不是,心疼以前写的代码一秒,多么幸运刚好没有影响,要不就崩了

示例:调换两个变量对应的值,通过两种传递参数的方式(按值,按地址),看看效果

实现结果
1.png

思考:实验设计

  1. 主过程中有两个变量(x=1 ,y=2),有两个子过程,都是为了实现数值互换,一个是按值传递,一个是按地址传递
  2. 进入子过程前输出一次x,y值,进入子过程后再分别输出一次,效果如上图
  3. 核心概念:按值传递,在参数前加上 ByVal ;按地址传递,是默认的方式,啥也不用加,或者也可以加上 ByRef

代码

主过程main

Sub main()
    x = 1
    y = 2

    Debug.Print ("转换之前")
    Debug.Print ("x=" & x)
    Debug.Print ("y=" & y)

    Call 按值传递_转换顺序(x, y)
    Debug.Print ("")
    Debug.Print ("按值传递")
    Debug.Print ("x=" & x)
    Debug.Print ("y=" & y)

    Call 按地址传递_转换顺序(x, y)
    Debug.Print ("")
    Debug.Print ("按地址传递")
    Debug.Print ("x=" & x)
    Debug.Print ("y=" & y)

End Sub

代码截图
2.png

子过程1:按值传递

Sub 按值传递_转换顺序(ByVal a, ByVal b)
    '换顺序
     c = a
     a = b
     b = c

End Sub

代码截图
3.png

子过程2:按地址传递

Sub 按地址传递_转换顺序(a, b)
    '换顺序
     c = a
     a = b
     b = c

End Sub

代码截图
4.png

代码解读

  1. 两个子过程,内部代码没有任何区别,只是在参数定义上有一点区别(ByVal
  2. 从效果上看,默认情况是按地址(ByRef)传递的,详细可以看看Sub的帮助文件
  3. 按值传递相当于复制一份原参数的值,对原参数没有任何影响;按地址传递,可以理解成直接对原参数进行操作

Sub的帮助文件
5.png

扫描二维码关注公众号,回复: 1817586 查看本文章

参数说明
6.png

Ps:那么一些特殊的变量类型,例如字典是不是也是按照这个标准去执行,大家不妨去试一下


更多精彩,请关注微信公众号
扫描二维码,关注本公众号

公众号底部二维码.jpg

猜你喜欢

转载自blog.csdn.net/fourseasonbeans/article/details/80793297
今日推荐