搜索

首页  >  问答  >  正文

c++ - vb 中形参 实参 ByVal ByRef 有什么实例?

编程业余爱好者..

我也百度搜了,但是说的我也看不明白,都是专业属于...

别鄙视我,给我举个简单的例子呗.

天蓬老师天蓬老师2804 天前902

全部回复(3)我来回复

  • PHPz

    PHPz2017-04-17 14:30:22

    Sub Foo(ByVal p1, ByRef p2)
      p1 = 9
      p2 = 9
    End Sub
    
    Dim a As Integer
    Dim b As Integer
    a = 1 : b = 2
    Foo(a, b)
    ' 此时 a 的值不变,仍为 1
    ' b 的值变为 9

    这里“形参”就是p1p2,“实参”就是ab
    调用Foo时,系统把a复制了一份传给p1,因此改变p1的值不影响a。而p2代表对b变量的引用,改变p2也会让b变化。

    好久不写 VB 了,有错还请各位指正。

    回复
    0
  • 高洛峰

    高洛峰2017-04-17 14:30:22

    Sub Foo(ByVal p1, ByRef p2)
      p1 + p2
    End Sub
    

    形参就是预设的可传入参数,Foo 声明了接受两个参数,p1 和 p2。这个时候实际上p1 和 p2只是理想状态,并不是实际参数,所以叫形参

    Foo(1, 2)
    

    调用Foo的时候传进去两个实际的,有意义的参数,1和2是实际参数,所以叫实参

    回复
    0
  • 迷茫

    迷茫2017-04-17 14:30:22

    先弄明白形参和实参,形参是定义函数时括号里的参数,实参就是使用这个函数时实际上往里传入的参数。
    再弄明白,变量是存在内存里的,每个变量会有属于自己的一块独立的内存空间,每个内存空间又有地址,通过地址能找到这块内存。
    然后看这两个英文的意思,ByVal:按值传递,ByRef:按地址传递。
    什么是按值传递呢?就是先给形参开辟一个新的内存空间,将实参的内容传入这个新的内存空间,这样传递后,形参与实参是在两个不同的内存空间中,也就是说他们是相互独立的,你在函数中怎么折腾这个形参,折腾的都是这个临时内存空间,和实参没关系,它静静的躺在自己的小屋里。
    什么是按地址传递呢?就是直接将实参的内存空间地址传递给形参,这样,形参与实参就共用一块内存,所以,形参内容的改变也直接改变了实参的内容,你在函数中折腾形参,等同于折腾实参。
    所以一般情况下,函数都会有个返回,因为函数默认都是按值传递,如果不返回,这个函数执行完,那些临时内存空间就释放了,执行半天啥也没了,当然,如果你定义了按地址传递,那就无需返回了。

    回复
    0
  • 取消回复