Visual Basic 值传递与地址传递

值传递与地址传递

传递参数的方式有两种:如果调用语句中的实际参数是常量或表达式,或定义过程时选用ByVal关键字,就可以按值传递。如果调用语句中实际参数为变量,或定义过程时选用ByRef关键字,就可以按地址传递。

1. 按值传递参数

按值传递参数时,Visual Basic给传递的形参分配一个临时的内存单元,将实参的值传递到这个临时单元去。实参向形参传递是单向的,如果在被调用的过程中改变了形参值,则只是临时单元的值变动,不会影响实参变量本身。当被调用过程结束返回主调过程时,Visual Basic将释放形参的临时内存单元。

当要求变量按值传递时,可以先把变量变成一个表达式,把变量转换成表达式的最简单的方法就是把它放在括号内。例如把变量"A"用括号括起来,"(A)"就成为一个表达式了。或者定义过程时用ByVal关键字指出参数是按值来传递的。

【例5.3】 用函数过程编写程序,求a,b两数中最大数。

Max函数为求最大数,在Command1_click中调用Max函数,程序代码如下:

Private Function Max(ByVal x As Integer, ByVal y As Integer)

Dim z As Integer

If x < y Then z = x: x = y: y = z

Max = x

TextX.Text = x

TextY.Text = y

End Function

Private Sub Command1_Click()

Dim a As Integer, b As Integer, c As Integer

a = Val(TextA.Text)

b = Val(TextB.Text)

TextMax.Text = Max(a, b)

TextRA.Text = a

TextRB.Text = b

End Sub

在文本框中输入变量a为25、b为36,单击"计算"按钮,程序运行结果如图5.7所示。

图5.7 按值传递运行界面 图5.8 数据传递过程(按值)

通过函数调用,给形参分配临时内存单元x和y,将实参a和b的数据传递给形参,内存单元的存储值如图5.8所示。在被调函数中x,y和z交换数据,调用结束后,实参单元a和b仍保留原值,参数的传递是单向的。

2. 按地址传递参数

按地址传递参数,是指把形参变量的内存地址传递给被调用过程,形参和实参具有相同的地址,即形参、实参共享一段存储单元。因此,在被调过程中改变形参的值,则相应实参的值也被改变,也就是说,与按值传递参数不同,按地址传递参数可以在被调过程中改变实参的值。系统缺省情况下是按地址传递参数。在传址调用时,实参必须是变量,常量或表达式无法传址。

如果将例5.4求两数中最大数的程序改为按址传递,Max函数的代码如下:

Private Function Max(x As Integer, y As Integer)

......

End Function

其他程序代码不变。

当输入变量a为25、b为36时,形参与实参的数据传递如图5.9所示。

图5.9 数据传递过程(按址) 图5.10 按址传递运行结果

由于形参和实参共用同一内存单元,在被调用函数中交换x和y的数值后,a和b的数值也同样发生变化。程序运行结果如图5.10所示。

采用值传递只能从外界向过程传入信息,但不能传出;而采用地址传递则既能传入、又能传出。正是由于不能传出,过程结束后,值传递中形参值变化就不会影响外界的任何量,因而在一定意义上说,值传递比较安全。

值传递和地址传递各有特点,采用哪一种更合适,则视情况而定。一般来说,需要传出参数值时应该用地址传递,否则采用值传递较好。

相关推荐
fqbqrr4 小时前
2606C++,C++构的多态
开发语言·c++
biter down4 小时前
从 0 到 1 搭建 Python 接口自动化测试框架(博客系统实战)
开发语言·python
wang09075 小时前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java5 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
threelab6 小时前
Three.js 物理模拟着色器 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器
武器大师726 小时前
lv_binding_js 代码解读
开发语言·javascript·ecmascript
不知名的老吴6 小时前
线程的生命周期之线程“插队“
java·开发语言·python
ANnianStriver6 小时前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
杨了个杨89827 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构