所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

什么是按值传递?

发布时间:2020-04-12 01:27:30

资讯分类:按值  传递  传递  调用  小孩
什么是按值传递?

按值传递:在过程被调用时,传递给形参的是调用过程中的相应实参的值,形参与实参各占有不同位置的储存空间,被调用过程在执行过程中,改变了形参变量的值,但不会调用过程的实参值。按地址传递:就是当调用一个过程时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用过程中改变形参的值,就等于改变了实参的值。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]viewplaincopyprint?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(xAsInteger,yAsInteger)AsIntegerx=x*yIfx<>0Thenfun=xElsefun=yEndIfEndFunctionPrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=2 b=3 Text1.Text=fun(a,b) Text2.Text=fun(a,b) Text3.Text=fun(a,b) Text4.Text=fun(a,b)EndSub下面是运行的结果,通过结果可以看出,这个是按值传递的,每一次运算后a的值都在变化。按值传递[plain]viewplaincopyprint?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(ByValxAsInteger,ByValyAsInteger)x=x*5y=y/5Print"x=";x,"y=";yEndSubPrivateSubCommand1_Click()DimaAsInteger,bAsIntegera=10b=90texta,bPrint"a=";a,"b=";bEndSub由运行结果可以看出,尽管x,y的值经过运算后发生了变化,但是a,b的值仍然没有改变,这就是按值传递的小例子,就像上面图解的那样,传递过去的只是一个副本,而本身没有发生任何变化通过例子的观察和理解相信不懂参数传递的你也会和我一样理解了吧

留言与评论(共有 0 条评论)
   
验证码:
Top