按值传递,按地址传递,你究竟是哪样

微信公众号原文web

系统:Windows 7
软件:Excel 2010微信

使用场景or困惑

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

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

实现结果
1.pngspa

思考:实验设计

  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.png3d

子过程1:按值传递code

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

End Sub

代码截图
3.pngxml

子过程2:按地址传递blog

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

End Sub

代码截图
4.pngget

代码解读

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

Sub的帮助文件
5.png

参数说明
6.png

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


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

公众号底部二维码.jpg