当前位置: 首页 > 图文教程 > 网络编程 > ASP > ByVal和ByRef(编写ASP子程序所用到命令)

ASP
asp分页(自己整理的2个分页程序)
ASP常用的系统配置函数
雨哲防采集策略之列表篇
雨哲浅谈关于防采集而不影响收录内容篇
asp数据库连接函数
ajax XMLHTTP Post Form时的表单乱码综合解决
ASP注入详细命令40条
用ASP实现MSSQL用户密码破解
ASP创建对象的两种方法比较
ASP字符串转换为整形、双精度型、布尔
ASP计算str2在str1中出现的次数
asp采集抓取网上房产信息的代码
ASP注册登陆实例代码
ASP中使用FileSystemObject时提高性能的方法
分享一个好东东,动态Include文件 (Dynamic File Includes)
解决 JScript 中使用日期类型数据时出现类型错误的问题
在ASP里面创建GUID
在JScript中使用缓存技术的实际代码
ASP javascript Application对象的Contents和StaticObjects做Cache的一些经验
海阳2006+功能中的潜水王

ByVal和ByRef(编写ASP子程序所用到命令)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 175 ::
收藏到网摘: n/a

ByVal 传送参数内存的一个拷贝给被调用者。也就是说,栈中压入的直接就是所传的值。
ByRef 传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。
ByVal是传递值 源数据不会被修改
你可以把这个值当作自己的局部变量来使用
ByRef是传递地址 , 源数据可能被修改
你对这个变量的操作将对你传入的那个变量产生影响,就像指针的感觉
实例:
复制代码 代码如下:

sub Add1(ByVal no as int32)
no=no+100
end sub
sub Add2(ByRef no as int32)
no=no+100
end sub
private sub button1_click(sender as object,e as eventargs)handles button1.click
dim a as int32
a=100
Add1(a)
msgbox ("a的值为:" & a) '显示:a的值为100
Add2(a)
msgbox ("a的值为:" & a) '显示:a的值为200,因为Add2中的参数no为ByRef,即
'按地址传递,因此在Add2中对no进行修改后,将会导致
'源参数a的值也被修改。
End Sub

——————————————————————————————————————
3、ByVal和ByRef
ByVal传递的参数值,而ByRef传递的参数的地址。在这里,我们不用去区别传指针/传地址/传引用的不同,在VB里,它们根本就是一个东西的三种不同说法,即使VB的文档里也有地方在混用这些术语(但在C++里的确要区分指针和引用)
初次接触上面的程序二SwapPtr的朋友,一定要搞清在里面的CopyMemory调用中,在什么地方要加ByVal,什么地方不加(不加ByVal就是使用VB缺省的ByRef)
准确的理解传值和传地址(指针)的区别,是在VB里正确使用指针的基础。
现在一个最简单的实验来看这个问题,如下面的程序三:
【程序三】:'体会ByVal和ByRef
Sub TestCopyMemory()
Dim k As Long
k = 5
Note: CopyMemory ByVal VarPtr(k), 40000, 4
Debug.Print k
End Sub
上面标号Note处的语句的目的,是将k赋值为40000,等同于语句k=40000,你可以在"立即"窗口试验一下,会发现k的值的确成了40000。
实际上上面这个语句,翻译成白话:
-----------------------------------------------------------------
就是从保存常数40000的临时变量处拷贝4个字节到变量k所在的内存中。
-----------------------------------------------------------------
现在我们来改变一个Note处的语句,若改成下面的语句:
Note2: CopyMemory ByVal VarPtr(k), ByVal 40000, 4
这句话的意思就成了,从地址40000拷贝4个字节到变量k所在的内存中。由于地址40000所在的内存我们无权访问,操作系统会给我们一个Access Violation内存越权访问错误,告诉我们"试图读取位置0x00009c40处内存时出错,该内存不能为'Read'"。
我们再改成如下的语句看看。
Note3: CopyMemory VarPtr(k), 40000, 4
这句话的意思就成了,从保存常数40000的临时变量处拷贝4个字节到到保存变量k所在内存地址值的临时变量处。这不会出出内存越权访问错误,但k的值并没有变。
我们可以把程序改改以更清楚的休现这种区别,如下面的程序四:
【程序四】:'看看我们的东西被拷贝到哪儿去了
Sub TestCopyMemory()
Dim i As Long, k As Long
k = 5
i = VarPtr(k)
NOTE4: CopyMemory i, 40000, 4
Debug.Print k
Debug.Print i
i = VarPtr(k)
NOTE5: CopyMemory ByVal i, 40000, 4
Debug.Print k
End Sub
程序输出:
5
40000
40000
由于NOTE4处使用缺省的ByRef,传递的是i的地址(也就是指向i的指针),所以常量40000拷贝到了变量i里,因此i的值成了40000,而k的值却没有变化。但是,在NOTE4前有:i=VarPtr(k),本意是要把i本身做为一个指针来使用。这时,我们必须如NOTE5那样用ByVal来传递指针i,由于i是指向变量k的指针,所以最后常量40000被