当前位置:文档之家› VB参数传递(传值ByVal与传址ByRef)

VB参数传递(传值ByVal与传址ByRef)

VB参数传递(传值ByVal与传址ByRef)
VB参数传递(传值ByVal与传址ByRef)

VB参数传递(传值ByVal与传址ByRef)在过程调用时,一般主调过程与被调过程之间有数据传递,即将主调过程的实参传递给被调过程的形参,完成实参与形参的结合,然后执行被调过程体,被调过程执行结束后返回主调程序,并根据所使用的参数传递方式,决定是否将被调过程的形参值返回给主调过程的实参。在VB中,实参与形参的结合有两种方式,即传值(ByVal)和传址(ByRef)。下面将采用图示方法,结合实例,对两种参数传递方式进行深人分析。

1.传值方式(ByVal)。

VB中的传值方式,实参与形参在内存中占用不同的内存单元,当调用一个过程时,系统把实参的值复制一份给形参,实参与形参就断开了联系,被调过程中的操作是在形参自己的内存单元中进行,当过程调用结束时,形参所占用的内存单元同时被释放,调用过程中对形参值的改变对实参没有影响。因此,值传递方式又称为单向传递,即只能由实参传递给形参,形参的值不能返回给实参。在过程定义时,必须明确指定参数是按值传递的,在形参的前面加上关键字ByVal。

(I)应用举例。

采用值传递方式,编写交换两个数的过程Swap。分析能否真正实现两数互换

Swap 子过程:

主调过程:

执行程序,运行结果:A = 10,B =20,并未实现a、b互换。

2.传址方式(ByRef)。

传址方式也称引用方式,是VB默认的参数传递方式,当调用一个过程时,系统将实参的地址传递给形参,实参与形参在内存中占用相同的存储单元。因此,被调过程中形参值发生变化,主调过程中实参值也会随之变化,这种传递方式是双向的,也称双向传递。

总之,传值时就是在内存中新开辟一个空间,将值赋给这个新开辟的空间,其生命周期为该函数调用结束时释放该空闲,计算结果不影响原调用数据内存空间的值。

传址时同样新开辟一个空间,但不同的是将所用数据空间的内存地址存在新开辟的空间中,即指针,函数在数据处理过程中由于是指针,即对源数据进行操作,操作后结果影响原数据。

什么时候用传值、传址,比较有用。

求若干个数的最大公约数。

Option Base 1

Private Function gcd(ByVal m%,ByVal n%)As Integer

If m < n Then t = m: m = n: n = t

Do

r = m Mod n

If r =0Then Exit Do

m = n

n = r

Loop

gcd = n

End Function

Private Sub Command1_Click()

Dim a()As Integer

n = InputBox("输入n")

ReDim a(n)

For i =1To n '输入要求公约数的n个数

a(i)= InputBox("输入数据")

Next i

n1 = a(1)

For i =2To n 'n个数调用n-1次gcd函数过程求最大公约数

m1 = a(i)

mn = gcd(m1, n1)

If mn =1Then Exit For Else n1 = mn '只要某次求得的最大公约数为1,不再往下求

Next i

Print mn '显示n个数中的最大公约数

End Sub

计算乘幂

如果去掉ByVal,则结果

而书中的结果不同,但解释是:

过程Power中的参数y使用了关键字ByVal,因而事件过程可以顺利执行,5

次循环分别打印出的值。但是,如果去掉参数y前面的关键字ByVal,则无法得到预期的结果。这是因为,第一次调用Power后,i 被重新设置为0(参数y是i的地址),然后For语句使i加1,再开始循环。由于调用Power时总是将循环变量i设置为0, 所以For循环将不会停止,产生溢出。在这种情况下,ByVal就不是可有可无的了。

究竟什么时候用传值方式,什么时候用传地址方式,没有硬性规定,下面几条规则可供参考:

(1) 对于整型、长整型或单精度参数,如果不希望过程修改实参的值,则应加上关键字ByVal(值传送)。而为了提高效率,字符串和数组应通过地址传送。此外,用户定义的类型(记录)和控件只能通过地址传送。

(2) 对于其他数据类型,包括双精度型、货币型和变体数据类型,可以用两种方式传送。经验证明,此类参数最好用传值方式传送,这样可以避免错用参数。

(3) 如果没有把握,则最好能用传值方式来传送所有变量(字符串、数组和记录类型变量除外),在编写完程序并能正确运行后,再把部分参数改为传地址,以加快运行速度。这样,即使在删除一些ByVal后程序不能正确运行,也很容易査出错在什么地方。

(4) 用Function过程可以通过过程名返回值,但只能返回一个值;Sub过程不能通过过程名返回值,但可以通过参数返回值,并可以返回多个值。当需要用Sub过程返回值时,其相应的参数要用传地址方式。例如:

Sub S(ByVal x As Integer, ByVal y As Integer, m As Integer, n As Integer)

m = x + y

n = x * y

End Sub

Private Sub Command1_Click()

Dim Sum As Integer, Mul As Integer

S 20, 30, Sum, Mul

Print Sum, Mul

End Sub

在这个例子中,通用过程S有4个参数,后面两个参数用来存放计算结果。当在事件过程中调用该过程时,从通用过程S返回两个数的和(Sum)与积(Mul)。在这种情况下,S 过程中的参数m和n必须使用传地址方式。

函数参数传递的原理

函数参数传递的原理 参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有按值传递参数,按地址传递参数和按数组传递参数。 形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。形参可以是除定长字符串变量之外的合法变量名,也可以带括号的数组名。 实参:实参就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。 等号、函数名称、括弧和参数,是函数的四个组成部分。 函数“=SUM(1,2,3)”,1、2和3就是SUM函数的参数,没有参数1、2、3,函数SUM 则无从求值。 函数“=VLOOKUP(2,A:C,3,)”,没有参数2、A:C和3,函数VLOOKUP如何在A:C 区域查找A列中是2那一行第3列的数值? 当然,也有不需要参数的函数,如“=PI()”、“=NOW()”、“TODAY()”等。 函数参数传递的原理C语言中参数的传递方式一般存在两种方式:一种是通过栈的形式传递,另一种是通过寄存器的方式传递的。这次,我们只是详细描述一下第一种参数传递方式,另外一种方式在这里不做详细介绍。 首先,我们看一下,下面一个简单的调用例程: int Add (int a,int b,int c) { return a+b+c; }

参数传递方式与解题应用(精)

VB过程中使用的参数分为实参和形参,简单的讲,在过程定义中给定的参数是形参,而在过程调用语句中给定的参数是实参。当调用一个有参数的过程时,形参和实参逐一匹配传递,根据传递方式不同,可分为按值和按地址两种。对参数传递方式的正确判别是过程学习中的一个难点,也是等级考试中的一个考点。 一、按值与按地址方式的内涵 按值传递参数,实质上是将实参的值复制一份给形参,因此形参获得的是实参的副本,当过程执行中对形参进行改变,并不会影响实参本身;按地址传递参数,实质上是将实参变量的地址传递给形参,因此形参与实参将指向同一内存单元,当过程执行中形参发生改变时,对应实参也将跟着改变。 二、参数传递方式判别方法 判断参数传递方式,不能单纯的看过程定义中形参前的修饰限定词有无By Val。参数传递到底采用何种方式,不仅取决于过程定义,还取决于过程调用,即与对应实参的具体形式也有很大关系。因此,应该从以下三个方面综合考虑: 1.形参是否为数组或者控件 2.形参前是否有ByVal修饰 3.对应实参是否为表达式或者值 具体判别方法,请见如下判别流程图。

三、不同传递方式对参数类型的要求 若参数按地址传递,则VB要求实参的数据类型与形参的数据类型完全一致;若参数按值传递,则实参数据类型不要求与形参完全一致,但是必须能够由VB 默认转化。 四、解题应用 (一)以江苏省计算机等级考试2001年春季的一道考题为例: 在应用程序中用“Private Function Fun(X As Integer, Y As Single)”定义了函数Fun. 调用函数Fun的过程中的变量I,J均定义为Integer型,能正确引用函数Fun的是____ ①Fun(I,J) ②Call Fun(I,3.65) ③Fun(3.14,234) ④Fun(“245”, “231.5”) A.①③ B.②③④ C.①②③ D.①②③④ 分析:

过程和参数传递

1. 过程是子程序的一种形式,过程文件的形式为: PROCEDURE| function <过程名> [PARAMETERS<参数列表>] <语句系列> [RETURN[<表达式>]] [ENDPROC|endfunc] 2调用过程的方法 格式一: DO <过程名>|<文件名> WITH <实参表> 格式二: <过程名>|<文件名>(<实参表> ) 过程举例: SET TALK OFF CLEAR ?”主程序” DO tt1 DO tt2 RETURN PROCEDURE tt1 ?”过程…tt1” PROCEDURE tt2 ?”过程…tt2”

结果: 主程序 过程…tt1 过程…tt2 3.过程文件的打开 格式:SET PROCEDURE TO <过程文件名> 4.过程文件的关闭 关闭所有已打开的过程文件 SET PROCEDURE TO 关闭指定已打开的过程文件 RELEASE PROCEDURE <过程文件名1> [,<过程文件名2> …] 5.参数传递 (1)接收参数的命令 格式一:PARAMETERS <形参1>[,<形参2>,…] 格式二:LPARAMETERS <形参1>[,<形参2>,…] (2)调用带参数过程的命令 格式一: DO <过程名>|文件名WITH <实参1>[,<实参2>,…] 格式二: <过程名>|<文件名>(<实参1> [,<实参2>,…]) (3)说明 ①实参可以是常量、变量,也可以是一般般形式的表达式; ②调用时,实参传递给形参;

③形参数目不能少于实参数目; ④形参多于实参时,多余的形参初值为逻辑假。 (4)参数传递方式 格式:SET UDFPARMS TO VALUE|REFERENCE ①按值传递(传值):计算实参的值,将值放入内存变量,再将值传给形参变量。形参变量值的改变不会影响实参变量的取值。 ②按引用传递(传地址):把实参变量的地址传递给对应的形参变量,形参变量变化时,实参变量值也随之变化。 6应用举例 例1 X=1 Y=2 Do p3 with (x),(y) &&按值传递 ?x,y Procedure p3 Parameters a,b a=3 b=4 Return 结果: 1 2 分析:(x),(y) 表示按值传递给形参x,y,在p3中,虽然x=3,y=4发生了变化,但形参变量值的改变不会影响实参变量的取值。 所以输出的还是原来实参的值。

C++语言中函数参数传递方式的图示说明

C++语言中函数参数传递方式的图示说明 摘要:学习C++语言中函数参数传递方式的关键是给出函数调用过程中内存各段内容的变化图示。本文针对C++语言中三种函数参数传递方式,辅以代码段内容图示和堆栈段内容图示,从机理上详细解释了函数参数的传递过程。实践表明,这种图示说明的方法在教学中取得了非常良好的效果。 关键词:函数调用;参数传递;代码段;堆栈段 1背景 “C++程序设计”是高等学校计算机专业或非计算机专业学生的必修课。对于非计算机专业的学生,C++语言是他们真正学习和使用计算机语言进行编程的关键入门,对于以后在其专业应用开发中具有至关重要的作用。即使以后使用其他编程语言进行专业项目的开发,如VB、C和Java语言,C++语言由于其概念的广泛性和综合性,也能够使得他们很快学习并掌握这些编程语言。而对于计算机专业的学生来说,“C++程序设计”是“数据结构”、“算法设计”等核心课程的先修课,同时,“C++程序设计”中涉及的部分硬件知识也是其学习计算机原理的重要基础。 但是,C++作为入门程序语言课程,对于初学者来说确实难度较大。周立章对自己的教学实践进行总结,强调分层教学、案例教学和对计算机实验进行改革的思想[1];李新霞在C++的前驱语言C语言的教学实践中也表达了类似的思想[2]。因此,案例教学对C++语言来说是必不可少的。 对于大多数学生来说,C++程序设计学习中存在三个难点:(1)函数参数的传递;(2)指针变量的使用;(3)虚函数和多态性机制。 函数和类作为C++语言中的两种基本模块,分别支持C++语言进行面向过程的开发和面向对象的开发,而不论是何种开发方法,函数都是不可缺少的。一个完整的函数使用过程包括函数定义和函数调用,有时存在函数声明,而函数调用过程中,在主调函数和被调函数之间发生着数据的交互,表现为函数参数的传递和被调函数的返回值。 其中,对于函数参数传递方式及相关教学研究,得到了很多关注。马新将函数参数传递方式分为值传递方式和地址传递方式,并归纳总结了选用何种方式的条件[3];刘志华将函数参数传递方式分为简单变量作参数、指针作参数、引用作参数、数组作参数和字符串作参数共五种方式,并对每一种情况进行了实例描述[4];谭庆将函数参数传递方式分为传普通值调用、传地址值调用和引用调用三种方式,并对其使用方法进行了总结[5];王萍、谭浩强和陈志泊在其编写的相应教材中也对C++中函数参数传递方式给予了重点关注[6-8]。 本文就函数参数的传递方式,利用图示说明的方法进行研究,旨在搞清各种函数参数传递方式的本质,为函数的学习奠定坚实的基础。

浅析参数传递过程

浅析参数传递过程 写在前面的话: 本文只是比较简单的分析了下几种参数传递方式,另外很少地对比了下指针和引用的区别以及VC6.0下实现引用的机制,作者文笔不好,经常在东扯西扯。本文估计只能对新学习C/C++的朋友和对参数传递过程较模糊的朋友有用,如果您对参数传递过程比较模糊并且常在值传递和指针传递上出错,请耐心看完,希望大家共同进步! 1.指针和引用: C中有两种参数传递方式,值传递和指针变量传递。 C++中除了上述两种方式外,还有引用传递,引用其实就是变量的一个别名。很多初学C++的朋友容易混淆引用和指针的概念,当然,引用能干事情,指针都能干,以引用方式传递参数的形式与值传递类似,而内部实现机制又与指针方式类似,下面,我们先看看引用到底是怎么一回事: #include int main() { int actual=7; int "e=actual; std::cout<<&actual<<””<<"e< int main() { int x=7; int *ptr_1; int *ptr_2; ptr_1=&x; ptr_2=ptr_1; std::cout<<”address: ”<<&ptr_1<<””<<&ptr_2<

vb过程间参数的传递

一、形式参数与实际参数 1 形式参数:就是在定义函数或过程的时候命名的参数。通俗讲就是一个记号。 2 实际参数:就是在执行时,调用函数或过程时,传递给函数或过程的参数。通俗讲就是实际值。 3 参数嘛,就是一个可变量,它随着使用者的不同而发生变化。举个例子,在中学的时候学过sin(x)函数,这里的x就是形式参数,当你需要求1的正弦值时,你会使用sin(1),这里的1就是实际参数。 4 形参和实参间的关系:两者是在调用的时候进行结合的,通常实参会将取值传递给形参,形参去之后进行函数过程运算,然后可能将某些值经过参数或函数符号返回给调用者。 在过程之间传递参数,形式参数和实际参数是很重要的概念。我们通常说形式参数是过程为了运行的需要预先在内存中保留的地址单元,而实际参数就是在调用过程时放入这些内存地址中进行处理的数据。如果形式参数是一个盒子,那么实际参数就是盒子里面装的东西。在参数传递的过程中,形式参数和实际参数的数据类型要一致。 二、参数传递 函数参数的传递方式有两种,一种是按地址传递,一种是按值传递。 按地址传递:调用函数时,不直接把实参的值“告诉”函数,而是把地址“告诉”它,函数根据这个地址来寻找并处理值,如果函数修改了这个值,也就修改了这个地址对应的值。 按值传递:把值复制一份再给函数,这个值只属于函数,函数对这个值的修改不影响原值。 VBScript中,要按地址传递可在形参前加 ByRef,要按值传递得在形参前加 ByVal,如果什么也不加则表示按地址传递。 1)按值传递

如果在声明过程时,形式参数名前面加上关键字“ByVal”,即规定了在调用此过程时该参数是按值传递的。按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所做的改动只影响副本而不会影响变量本身。 代码1 ********************************** Private Sub Command1_Click() Dim num1 As Integer num1 = 5 Print num1 Call MySub(num1) Print num1 ' 输出结果为5 Call MySub2(num1) Print num1 ' 输出结果仍为5 End Sub Private Sub MySub(ByVal A As Integer) A = 10 End Sub Private Sub MySub2(ByVal A As String)

参数的传递

参数的传递 1.形参与实参的概念 形参:指出现在Sub 和Function过程形参表中的变量名、数组名,过程被调用前,没有分配内存,其作用是说明自变量的类型和形态以及在过程中的角色。形参可以是: 1)除定长字符串变量之外的合法变量名; 2)后面跟()括号的数组名。 实参:是在调用Sub 和Function过程时,传送给相应过程的变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但位置必须对应起来。 形参与实参的关系:形参如同公式中的符号,实参就是符号具体的值;调用过程:即实现形参与实参的结合,也就是把值代入公式进行计算。 2. 按值传递参数(定义时加ByVal) 按值传递参数(Passed By Value)时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。 3.按地址传递参数(定义时没有修饰词或带关键字ByRef) 按地址传递参数时,把实参变量的地址传送给被调用过程,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变。如果实参是一个常数或表达式,VB会按“传值”方式来处理。 4.数组参数 VB允许把数组作为形参出现在形参表中,语法:形参数组名() [As 数据类型] 形参数组只能按地址传递参数,对应的实参也必须是数组,且数据类型相同。调用过程时,把要传递的数组名放在实参表中,数组名后面不跟圆括号。在过程中不可以用Dim语句对形参数组进行声明,否则会产生“重复声明”的错误。但在使用动态数组时,可以用ReDim 语句改变形参数组的维界,重新定义数组的大小。 5. 对象参数 VB中可以向过程传递对象,在形参表中,把形参变量的类型声明为“Control”,可以向过程传递控件;若声明为“Form”,则可向过程传递窗体。对象的传递只能按地址传递。

传递过程工程技术

1前言 多孔介质中固定相形成的孔隙具有弯曲性、无定向性和随机性的特点,弥散效应使得多孔结构中的流动过程极其复杂,流体质点在多孔介质中不停地发生混合和分离,流速的大小和方向也在不断地改变,流动阻力大幅度增加。从层流到紊流的流态转变也大大提前。多孔介质的各相之间或各相内部存在温度(压力)差时,就会有流动或传热传质过程发生。多孔结构中的传热过程是由固定相内部和孔隙中流体内部的导热、对流换热和辐射换热等组成的耦合传热过程。如果多孔结构中流体存在相变,那么,传热过程将更为复杂。在揭示各相物质内部及相互间的质量、动量和能量传递规律方面,前人普遍采用了理论分析、数值模拟、实验研究等各种研究手段。由于多孔介质中流动与传热的机理尚不完善,在今后相当长的时间内,这一研究方向仍然是工程热物理领域的热点问题之一。 笼统来说,大部分材料都属于多孔介质,目前还没有对多孔介质各种特性的确定性作出准确的定义。1983年J.Bear提出多孔介质具有以下特点: (1)部分空间充满多相物质,至少其中一相物质是非固态的,可以是液态或气态。固相部分称为固相基质。多孔介质内部除了固相基质外的空间称为空隙空间。 (2)固相基质分布于整个多孔介质,在每个代表性初级单元均应有固相基质。 (3)至少一些空隙空间应该是相联通的。 下面就多孔介质中流动换热特性的研究现状做简要介绍。 1.1流动阻力特性 高雷诺数下多孔介质中的流动不再满足Darcy渗透定律。前人针对多孔介质中的Non Darcy流动阻力特性进行了大量的研究,提出了毛细管模型和阻力模型,在理论上对多孔介质中的流动进行合理的简化。在实验研究的基础上,提出了许多经验和半经验的阻力预测模型。其中,比较有影响的包括Kozeny-

子程序的参数传递(精)

子程序的参数传递 编写子程序时,很重要的一个工作是如何把参数传给子程序,这个过程叫参数传送。 传送方法有: 把参数放在CPU内部寄存器中 把参数放在变量中 把参数放在地址表中 利用堆栈传送参数 下面举例介绍第4种方法,它通常在主程序中把参数或参数地址保存在堆栈中,而在子程序中将参数从堆栈取出来。 例:把一个用十六进制表示的字→ASCII码,然 后送到屏幕上显示。 汇编程序如下: DATA SEGMENT NUM DW 25AFH ;要显示的数 STRING DB 4 DUP(?),13,10,’$’ DATA ENDS STACK SEGMENT DB 100 DUP(?) TOP EQU $ STACK ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN: MOV AX,DA TA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV SP,TOP LEA B X,STRING ;取变量偏址 PUSH BX ;将偏址压栈 PUSH NUM ;将变量压栈 CALL BINHEX ;(SP)=005EH CS:0113 LEA D X,STRING ;(DX)=0002H MOV AH,9 INT 21H MOV AH,4CH INT 21H *********************** BINHEX PROC PUSH BP ;(SP)=005CH MOV BP,SP ;(BP)=005CH PUSH AX ;(SP)=005AH PUSH DI ;(SP)=0058H

相关主题
文本预览
相关文档 最新文档