|
楼主 |
发表于 2015-6-23 08:31
|
显示全部楼层
本帖最后由 yiyiyicz 于 2015-6-26 09:16 编辑
每一行代码都司空见惯,可第一次心算往往是错误的
解释如下
这段实例代码使用的传址方式。为了便于理解,先回顾一些基本概念
(一)参数传递的机制
参数传递,谁传递给谁?“主程序”调用“子过程”(sub)或者“函数”(function),以达到程序员想要实现的目的
主程序(一楼实例代码的MainP), MainP()中Call god(x, x, z)这句代码,就是调用子过程god,而(x, x, z)即为要传递的参数。有时(x, x, z)也称为实参表
“子过程”(sub)或者“函数”(function),也即一楼实例代码中Sub god(x As Integer, y As Integer, z As Integer)。
(x As Integer, y As Integer, z As Integer),括号中三个参数代表要接收的参数。有时也叫形参表。
参数传递有两种方式:一种为【传址】,也就是Byref,通常可以省略;一种是【传值】,也就是Byval,不可以省略
这里,因为没有出现Byref,也没有Byval,所以采用的是传址,Byref省略了
接下来的问题就是:传址是怎么回事?传值又是怎么回事呢?
很学术的定义是这样的:
【传址】,主调程序将实参变量的的内存地址传给过程(子过程sub,或者函数function),而过程则通过内存地址访问实参
【传值】,把参数的数值传递给过程
咱们不是学计算机的,可以用土办法来理解这两个概念
【传址】,并没有直接告诉你参数的值,而是告诉你参数存放的地点。比如我让你取一本书,我告诉你的是这本书在书架第二层、左侧第三本书。而没有告诉你书名
【传值】,直接告诉你书名,在哪里你自己找。
用这种土法子,也有助于理解传值在调用中参数值不变,而传址则可以变。在传址的方法中,我只告诉你书在书架上的具体位置,而没有说书名。那么,我在这个位置放上《盗墓笔记》,则书(参数)就是小说《盗墓笔记》,如果放上一本《VBA入门》,那就是《VBA入门》。而传值方法,我直接告诉你的就是书名(参数值)---《盗墓笔记》,那么不管这本《盗墓笔记》是在书架上,还是厕所里,反正就是它了。
(二)计算过程
MainP过程中定义了三个变量x, y, z。分别为他们赋值1,2,3。调用时,将x的地址传给了子过程god的x和y这两个形参。实际上都是实参x的别名,对应的是同一个地址空间。
god在处理中对x和y值的更新,其实都是对实参x的更新。
具体处理过程如下
- x(形参)← x(实参)← 1 :y(形参)← x(实参)← 1 :z(形参)← z(实参)← 3
- x(形参) = 3 * z(实参已经通过形参赋值过) + 1 = 3*3+1 = 10
- x(实参)← x(形参)← 10:之前的x(实参)=1 这时已经被覆盖了
- y(形参) = 2 * z = 2*3 = 6
- x(实参)← y(形参)← 6:之前的x(实参)=10 这时再次被覆盖
- z(形参) = x(形参) + y(形参)= x(实参)+ x(实参)= 6+6 =12
|
|