什么是按值传递,什么是按地址传递?

这是一个VB编程问题,请高手指教!DimxAsinteger,kasinteger,nasintegerPrivateSubForm_click()StatickAsin... 这是一个VB编程问题,请高手指教!Dim x As integer,k as integer,n as integerPrivate Sub Form _click()Static k As integerDim m As integerk=k+2m=m+1n=n+1call proc(k,m)~第八行print k;m;npock k,nprint k;m;nEnd SubPrivate Sub proc(x As integer,y as integer)~第13行Dim t As integer t=x:x=y:y=tEnd Sub 问题1·单击窗体一次后在窗体上打印的结果为2·如果再单击窗体一次,则第二次单击后在窗体上新打印的内容为3·如果将程序的第八行改为Call proc (k+1,m),再单击窗体一次后在窗体上的打印结果为4·如果将程序的第13行改为Private Sub proc (ByVal x As integer,y As integer),再单击窗体一次后在窗体上的打印结果为这是大一一个VB期末考试题目,希望能有高手教我怎么解决,谢谢!! 展开
 我来答
huanglenzhi
2018-02-28 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517196
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

按值传递:在过程被调用时,传递给形参的是调用过程中的相应实参的值,形参与实参各占有不同位置的储存空间,被调用过程在执行过程中,改变了形参变量的值,但不会调用过程的实参值。

按地址传递:就是当调用一个过程时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用过程中改变形参的值,就等于改变了实参的值。

PS:其实我个人认为就像两个小孩,都有自己的家,按值传递的就像是一个小孩去另一个小孩家玩,玩一段时间还是要回自己各自的家,而他们俩的家却没啥联系,一点没变,还在那呢  而按地址传递呢,就像是假如其中一个小孩的家发大水啦,然后这个小孩无家可归了,于是被另外一个小孩家收留了,这个小孩带着自己东西去那个小孩家,这时两个小孩拥有的是相同的一个家,他们俩就有联系了,因为那个小孩的家换成另外一个了.(不知道举得例子是否恰当)

指针相信学习编程的人都知道吧,那么看看下面的例子

按值传递时,实质上实参a只是把一个副本传递给形参x,也可以直接理解为传递的结果是让x*2中的x的值等于10(即a的值),乘以2后再赋值(赋值不用解释吧)给x,即实际上w方法的运算并没有对a本身进行操作。所以调用w方法前后a值始终等于10,而w方法得到的结果是20。

按址传递时,实质上实参a是把指针(地址)传递给形参x,这个指针指向的地址的值即是10,此时a与x分别有一个指针同时指向10所在地址,即实际上w方法对a本身直接进行了操作(a自身参与运算)。所以调用w方法前后a值分别等于10和20,而w方法得到的结果是依然是20。

在比如拿VB中的例子来说

按地址传递

[plain] view plain copy print?

  • Functionfun(x As Integer, y As Integer) As Integer  

  • x = x * y  

  • If x<> 0 Then  

  • fun = x  

  • Else  

  • fun = y  

  • End If  

  • EndFunction  

  • Private SubCommand1_Click()  

  • Dim a AsInteger, b As Integer  

  • a = 2  

  • b = 3  

  • Text1.Text = fun(a, b)  

  • Text2.Text = fun(a, b)  

  • Text3.Text = fun(a, b)  

  • Text4.Text = fun(a, b)  

  • End Sub  

  • Functionfun(x As Integer, y As Integer) As Integer x = x * y If x<> 0 Then fun = x Else fun = y End If EndFunction Private SubCommand1_Click() Dim a AsInteger, b As Integer a = 2  b = 3  Text1.Text = fun(a, b)  Text2.Text = fun(a, b)  Text3.Text = fun(a, b)  Text4.Text = fun(a, b) End Sub


  • 下面是运行的结果,通过结果可以看出,这个是按值传递的, 每一次运算后a的值都在变化。
  • 按值传递

  • [plain] view plain copy print?
  • Subtext(ByVal x As Integer, ByVal y As Integer)  

  • x = x * 5  

  • y = y / 5  

  • Print"x="; x, "y= "; y  

  • End Sub  

  • Private SubCommand1_Click()  

  • Dim a AsInteger, b As Integer  

  • a = 10  

  • b = 90  

  • text a, b  

  • Print"a="; a, "b="; b  

  • End Sub  

  • Subtext(ByVal x As Integer, ByVal y As Integer) x = x * 5 y = y / 5 Print"x="; x, "y= "; y End Sub Private SubCommand1_Click() Dim a AsInteger, b As Integer a = 10 b = 90 text a, b Print"a="; a, "b="; b End Sub


  • 由运行结果可以看出,尽管x,y的值经过运算后发生了变化,但是a,b的值仍然没有改变,这就是按值传递的小例子,就像上面图解的那样,传递过去的只是一个副本,而本身没有发生任何变化
  • 通过例子的观察和理解相信不懂参数传递的你也会和我一样理解了吧

匿名用户
推荐于2016-10-07
展开全部
按地址: 一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。也就是说传递的是变量再内存中地址的指针或引用。

按值: 一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。也就是说传递的是变量的内容。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式