当前位置:编程学习 > VB >>

送分100分:关于字符串变量作为函数参数的简单问题

在一个资料中看到如下关于字符串参数的描述:
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByRef lpBuffer As Byte, ByVal nSize As Long) As Long 
其中:   ByVal lpBuffer As String 
传递字符串时,需要一个ByVal修饰符来把字符串缓冲区传递到API函数中,因为字符串变量实际上指示了字符串内容所在的内存地址。ByVal意味着被传递的是一个指向实际字符串内容的内存地址。


根据 以上描述,我在VB6中作了以下实验:

Dim s As String * 18

Private Sub Command1_Click()
s = "bcdesffddsd"
Label1.Caption = s
sd (s)    '
Label2.Caption = s
End Sub


Private Function sd(d As String) As String
  d = s
  d = "ab"
  sd = d
End Function

但是在执行完Command1_Click后,LABEL2上显示的还是bcdesffddsd,(开始时LABEL1、LABEL2显示均为空白),而非预想中的ab.

这如何理解呢,根据资料中的介绍,变量d接收的应是字符串s的地址,d的内容被改变,s的内容也应该被改变呀。

这是怎么回事呢。
--------------------编程问答-------------------- ByVal  是传值吧。ByRef才是传址 --------------------编程问答-------------------- sd (s)   -->至少这个地方你要去掉参数的括号,或者:
call sd(s)

没有call情况下,参数加上括号就是是传值了...    --------------------编程问答--------------------
sd (s)

这里的 () 不是调用函数的括号,而是 (s) 作为一个括号表达式,你对该表达式的运算结果进行修改,当然不影响变量 s 的值。
改成以下两者方式都可以
sd s

call sd(s)
--------------------编程问答-------------------- 看call帮助 --------------------编程问答--------------------
引用 2 楼 vbman2003 的回复:
sd (s)  -->至少这个地方你要去掉参数的括号,或者:
call sd(s)

没有call情况下,参数加上括号就是是传值了... 


真神仙也。 --------------------编程问答--------------------
引用 3 楼 tiger_zhao 的回复:
VB codesd (s)
这里的 () 不是调用函数的括号,而是 (s) 作为一个括号表达式,你对该表达式的运算结果进行修改,当然不影响变量 s 的值。
改成以下两者方式都可以
VB codesd s
VB codecall sd(s)


你更是神仙,请问为什么BYVAL 字符串变量,却成了传址呢。
--------------------编程问答-------------------- 括号表达式 --------------------编程问答-------------------- 把变量转换成表达式的最简单的方法就是把它放在括号内,这句是MSDN上的,而表达式是传值的
调用一个过程的方法常用有二种:
1.过程名 参数1,参数2....
这种方式参数不要放在括号内,否则有可能出错,也可能结果和楼主你现在一样了
当然你想保证传值,那么加上括号是可行的...
2.call 过程名(参数1,参数2....)
这里所有参数放在一个括号内,注意给某个参数再单独加上括号的结果就是传值...
--------------------编程问答-------------------- 参数传递总结:(个人看法,不一定对)
(1)ByRef-按址传递;ByVal-按值传递;没有ByRef,也没有ByVal-按址传递;
(2)ByRef-按址传递要求形参和实参的数据类型必须一致,ByVal-按值传递,形参和实参的数据类型不一定一致,VB可自动转换。
(3)调用时用Call参数要加括号,其中参数表中的参数再加括号,按址传递变为按值传递;
调用时有返回值实参数表要加括号;调用没有返回值实参数表加括号。
(4)对象和数组参数要按址传递,其它传值传址都行。
(5)传址时形参改变可能影响实参。 --------------------编程问答-------------------- TO SYSSZ

请问你在回答我的帖子时提到
3)调用时有返回值实参数表要加括号;调用没有返回值实参数表加括号。
是什么意思,可否举个具体的例子。
还有: (5)传址时形参改变可能影响实参。   为什么说是可能,不是讲此种情况下形参改变,与之对应的实参一定会改变吗? --------------------编程问答-------------------- 为什么字符串变量作实参时,函数的形参却用BYVAL,而不用BYREF.谁能回答这个问题,分全给他。 --------------------编程问答-------------------- 请仔细看完这个帖子:
http://topic.csdn.net/u/20090901/09/dddf35aa-7838-4415-85b2-222358422d81.html --------------------编程问答-------------------- 在VB中调用API时,如果API是ANSI版本,且参数是字符串,如Byval s As String,那么VB会自动作一些转换动作,首先将参数s变为byte数组,然后传入数组第一个成员的地址,执行完后,再将byte数组转换为UNICODE字符串,所以,为了防止参数传递错误,不妨避免使用ByVal s As String这样的声明,而是改为ByVal psz As Long这样的声明,一来可以加快运行速度,二来可以明确这是一个字符串指针。 --------------------编程问答-------------------- 我晕................................... --------------------编程问答-------------------- 真热闹 --------------------编程问答--------------------
引用 12 楼 tiger_zhao 的回复:
请仔细看完这个帖子:
http://topic.csdn.net/u/20090901/09/dddf35aa-7838-4415-85b2-222358422d81.html


这个精典的帖子中,我看到了好些英雄前辈。谢谢。TIGER_ZHAO. --------------------编程问答--------------------
引用 13 楼 lyserver 的回复:
在VB中调用API时,如果API是ANSI版本,且参数是字符串,如Byval s As String,那么VB会自动作一些转换动作,首先将参数s变为byte数组,然后传入数组第一个成员的地址,执行完后,再将byte数组转换为UNICODE字符串,所以,为了防止参数传递错误,不妨避免使用ByVal s As String这样的声明,而是改为ByVal psz As Long这样的声明,一来可以加快运?-


不妨避免使用ByVal s As String这样的声明,而是改为ByVal psz As Long这样的声明      能行吗?

大家都来讨论讨论,这样做有道理吗?

--------------------编程问答--------------------
引用 17 楼 famomo 的回复:
引用 13 楼 lyserver 的回复:
在VB中调用API时,如果API是ANSI版本,且参数是字符串,如Byval s As String,那么VB会自动作一些转换动作,首先将参数s变为byte数组,然后传入数组第一个成员的地址,执行完后,再将byte数组转换为UNICODE字符串,所以,为了防止参数传递错误,不妨避免使用ByVal s As String这样的声明,而是改为ByVal psz As Long这样的声明,一来可以加快运?-


不妨避免使用ByVal s As String这样的声明,而是改为ByVal psz As Long这样的声明   能行吗?

大家都来讨论讨论,这样做有道理吗?

没错.

这样能保证传入的字符串是原样传入的. --------------------编程问答-------------------- CSDN也有打盹的时候,整整停了近一个小时。 --------------------编程问答-------------------- 访问量这么巨大,能做成这样已经不错了. --------------------编程问答-------------------- 学习 --------------------编程问答--------------------
补充:VB ,  网络编程
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,