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所示。

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

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

相关推荐
CC.GG2 分钟前
【C++】AVL树
java·开发语言·c++
闲人编程3 分钟前
基础设施即代码(IaC)工具比较:Pulumi vs Terraform
java·数据库·terraform·iac·codecapsule·pulumi
墨上烟雨7 分钟前
Pandas 数据结构 - Series
数据结构·pandas
QQ_21696290969 分钟前
Spring Boot大学生社团管理平台 【部署教程+可完整运行源码+数据库】
java·数据库·spring boot·微信小程序
Ahtacca13 分钟前
Maven 入门:项目管理与依赖管理的核心玩法
java·maven
CoderCodingNo17 分钟前
【GESP】C++四级真题 luogu-B4416 [GESP202509 四级] 最长连续段
开发语言·c++·算法
a程序小傲19 分钟前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·后端·postgresql·面试·职场和发展
⑩-23 分钟前
Java四种线程创建方式
java·开发语言
月光在发光24 分钟前
22_GDB调试记录(未完成)
java·开发语言
222you26 分钟前
SpringAOP的介绍和入门
java·开发语言·spring