数据搬运工-VB中参数(ByVal,ByRef)的传递
2012-08-28 16:58
447 查看
在作品展中纠结过,到现在的学生信息管理系统,每一次使用ByVal和ByRef都让我如入云里雾里,而它们却是数据传递的关键,只有彻底理解了它们,我们的程序代码才能够在传递的过程中避免很多逻辑和意想不到的错误。
从你还记得吗-VB中Sub子过程与函数的调用中我们了解到了过程和调用它的数据之间都存在数据传递,VB使用参数列表这一形式来完成这个传递过程。过程本身使用的参数列表称为“形参”,而主程序传递给过程的真正参数称为“实参”,过程在被调用的过程中,用实参代替本身的形参,从而完成对真正的数据的操作。
在“实参”代替“形参”的传递过程中,VB提供了两种传递方式,即按数值(ByVal为参数)传递和按地址(ByRef为参数)传递,其中ByRef为默认的省略传递方式。
一、按值传递(ByVal)
值传递是指在程序中调用过程时,带实参值的调用语句知识将实参变量复制给过程中的形参,即将实参变量的副本传递给过程中的形参。如下面两个例子:
例1:
这两个例子的运行结果如下:
![](http://my.csdn.net/uploads/201208/28/1346138696_7906.jpg)
![](http://my.csdn.net/uploads/201208/28/1346138701_8695.jpg)
例1 例2
例1是先把变量转换为表达式后,传递给形参。但不会对实参产生影像,起到了值传递的作用,变量x,y所用的括号表示表达式的意思。例2虽然在过程中形参x、y做了交换,但是由于是值传递,实参a、b并没有交换。
通过上面可以看出:值传递方式的主要好处是“避免输入的变量在自定义过程中被意外修改”。值传递是单向传递,系统只是把实参变量的副本作为参数传递给过程,如果在过程里面改变了形参变量的值,所作的变动只影响副本而不会影像实参变量本身。
二、地址传递(ByRef)
与按值传递相反,如果参数采取的是按地址传递,则传给过程的将是真正的实参本身。采用地址传递方式,当调用过程语句被执行时,过程中的形参直接引用了调用语句中的实参,此时,形参与实参实质上使用的是同一个存储单元。因此,过程中对形参的操作都将对实参产生实际的影响。如下面的两个例子:
例3
例4
这两个例子的运行结果如下:
![](http://my.csdn.net/uploads/201208/28/1346144097_8433.jpg)
![](http://my.csdn.net/uploads/201208/28/1346141954_4877.jpg)
例3(1) 例3(2)
![](http://my.csdn.net/uploads/201208/28/1346144111_1928.jpg)
![](http://my.csdn.net/uploads/201208/28/1346141970_7996.jpg)
例4(1) 例4(2)
例3(1)可以看出,此时形参Y与实参X公用一个存储单元。从例3(2)中可以看出,过程中形参Y的变化导致了调用程序中实参X的改变。
例4(1)表明实参a、b与形参x、y分别共用一个存储单元。例4(2)表明过程中对形参x、y的交换实际上就是对实参a、b的交换,因此,实参a、b也完成了交换的操作。
因此,地址传递的方式可以使我们在过程中通过对形参的操作,直接修改实参变量的值。利用这一特点,可以将一些有用的信息或计算结果传递回调用过程的主程序中。
按地址传递参数在VB6.0中是省略的,这样容易导致在不注意的情况下改变实参,如果这种改变不是我们所需要的,就会产生“负面的影响”,如影响了程序的正常运行、产生了错误的运算结果等。因此,在编制按地址传递参数的过程中,对涉及形参的操作一定要慎重。
从你还记得吗-VB中Sub子过程与函数的调用中我们了解到了过程和调用它的数据之间都存在数据传递,VB使用参数列表这一形式来完成这个传递过程。过程本身使用的参数列表称为“形参”,而主程序传递给过程的真正参数称为“实参”,过程在被调用的过程中,用实参代替本身的形参,从而完成对真正的数据的操作。
在“实参”代替“形参”的传递过程中,VB提供了两种传递方式,即按数值(ByVal为参数)传递和按地址(ByRef为参数)传递,其中ByRef为默认的省略传递方式。
一、按值传递(ByVal)
值传递是指在程序中调用过程时,带实参值的调用语句知识将实参变量复制给过程中的形参,即将实参变量的副本传递给过程中的形参。如下面两个例子:
例1:
Private Sub Command2_Click() Dim x As Integer, y As Integer x = 3 y = 4 Call abc((x), (y)) Print "实参的值" Print "x="; x, "y="; y End Sub
Sub abc(a, b) a = a + b b = b + a Print "形参的值" Print "a="; a, "b="; b End Sub例2:
Private Sub Command1_Click() Dim a As Integer, b As Integer a = 8 b = 15 Print "调用过程前" Print "a="; a, "b="; b Call Swap1(a, b) Print Print "调用过程后" Print "a="; a, "b"; b End Sub
Sub Swap1(ByVal x As Integer, ByVal y As Integer) Dim t As Integer t = x x = y y = t End Sub
这两个例子的运行结果如下:
![](http://my.csdn.net/uploads/201208/28/1346138696_7906.jpg)
![](http://my.csdn.net/uploads/201208/28/1346138701_8695.jpg)
例1 例2
例1是先把变量转换为表达式后,传递给形参。但不会对实参产生影像,起到了值传递的作用,变量x,y所用的括号表示表达式的意思。例2虽然在过程中形参x、y做了交换,但是由于是值传递,实参a、b并没有交换。
通过上面可以看出:值传递方式的主要好处是“避免输入的变量在自定义过程中被意外修改”。值传递是单向传递,系统只是把实参变量的副本作为参数传递给过程,如果在过程里面改变了形参变量的值,所作的变动只影响副本而不会影像实参变量本身。
二、地址传递(ByRef)
与按值传递相反,如果参数采取的是按地址传递,则传给过程的将是真正的实参本身。采用地址传递方式,当调用过程语句被执行时,过程中的形参直接引用了调用语句中的实参,此时,形参与实参实质上使用的是同一个存储单元。因此,过程中对形参的操作都将对实参产生实际的影响。如下面的两个例子:
例3
Private Sub Command1_Click() Dim x As Integer x = 5 Print "调用过程前的X:"; x Print Call procx(x) Print "调用过程后的X:"; x End Sub
Sub procx(ByRef y As Integer) y = y + 5 End Sub
例4
Private Sub Command1_Click() Dim a As Integer, b As Integer a = 8 b = 15 Print "调用过程前" Print "a="; a, "b="; b Call swap2(a, b) Print Print "调用过程后" Print "a="; a, "b="; b End Sub
Sub swap2(x As Integer, y As Integer) Dim t As Integer t = x x = y y = t End Sub
这两个例子的运行结果如下:
![](http://my.csdn.net/uploads/201208/28/1346144097_8433.jpg)
![](http://my.csdn.net/uploads/201208/28/1346141954_4877.jpg)
例3(1) 例3(2)
![](http://my.csdn.net/uploads/201208/28/1346144111_1928.jpg)
![](http://my.csdn.net/uploads/201208/28/1346141970_7996.jpg)
例4(1) 例4(2)
例3(1)可以看出,此时形参Y与实参X公用一个存储单元。从例3(2)中可以看出,过程中形参Y的变化导致了调用程序中实参X的改变。
例4(1)表明实参a、b与形参x、y分别共用一个存储单元。例4(2)表明过程中对形参x、y的交换实际上就是对实参a、b的交换,因此,实参a、b也完成了交换的操作。
因此,地址传递的方式可以使我们在过程中通过对形参的操作,直接修改实参变量的值。利用这一特点,可以将一些有用的信息或计算结果传递回调用过程的主程序中。
按地址传递参数在VB6.0中是省略的,这样容易导致在不注意的情况下改变实参,如果这种改变不是我们所需要的,就会产生“负面的影响”,如影响了程序的正常运行、产生了错误的运算结果等。因此,在编制按地址传递参数的过程中,对涉及形参的操作一定要慎重。
相关文章推荐
- 使用VB写ASP组件的朋友,你还在用ByRef传递参数吗?
- post传递数据到服务端参数怎么添加
- 点击 VB 中 DataGrid 行 触发事件 弹出窗口 并传递 所点击行参数
- Activity传递参数——传递自定义数据类型
- VB.NET调用非托管DLL组件问题(传递给系统调用的数据区域太小)
- [VB.NET]窗体与窗体数据传递问题?
- VB调用DLL时传递自定义类型数组参数注意
- 向Composite风格数据窗口传递参数
- 【Angular4学习】--路由传参一(在查询参数中传递数据)
- vb中byref参数类型不符
- 基本数据类型参数传递与引用型数据类型参数传递
- Android笔记——不同apk之间传递参数与数据
- JavaScript 函数参数是传值(byVal)还是传址(byRef)?
- C51中汇编的使用及参数传递与数据返回
- 基本数据类型参数传递图解引用数据类型参数传递图解
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- 在VB中实现向函数传递不定个数参数
- 如何将下拉数据集中的显示值作为参数传递
- 引用数据类型的参数传递
- php 分页显示数据 post参数传递问题解决方法