精华内容
下载资源
问答
  • 再看第10行,对于过程B,它的参数传递方式使用了ByVal关键字(即传值) 对于ByVal(传值),参数t和x根本就是不相关的两个变量。就如同两个人一样(以甲、乙为例),起初甲有两个苹果,然后甲告诉乙,你现在也有两个...
    1    Private Sub Form_Load()
    2            Dim x As Integer
    3            x = 2
    4            A x
    5            Debug.Print x
    6    End Sub
    7    Sub A(ByRef t As Integer)
    8            t = t - 1
    9    End Sub
    10    Sub B(ByVal t As Integer)
    11            t = t - 1
    12    End Sub
    13    Sub C(t As Integer)
    14            t = t - 1
    15    End Sub
    这是一个极为简单的Toy程序(呵呵,就是小玩具),不过他却体现了传值和传引用的巨大区别。
    第7、10、13行分别是一个过程,这些过程都实现了同一功能,即将参数t的值减一。
    在窗体的Load事件中,我们定义了一个变量x,然后调用第一个过程(A),注意到第7行中的参数列表中ByRef关键字,它代表传引用。
    对于传引用,参数t 和 x其实就是一个变量。就像人有大名也可能有外号的道理一样。现在对于变量x,它的大名是x,外号是t。那么t-1其实就是x-1.最后打印出来的结果是x-1=1.
    再看第10行,对于过程B,它的参数传递方式使用了ByVal关键字(即传值)
    对于ByVal(传值),参数t和x根本就是不相关的两个变量。就如同两个人一样(以甲、乙为例),起初甲有两个苹果,然后甲告诉乙,你现在也有两个苹果了,于是乙乐呵呵的拿着两个苹果去过程B中,过程B的作用是将乙的苹果数减一,那么最后程序所要打印的是甲的苹果数,显然,苹果数2。根本没发生变化。那么有的朋友会问,这时乙的苹果数是1吧。答案是错的。对于变量,它是有生命周期的(在编程中叫做变量的作用域)。上面的代码中,变量x的有效期从Form_Load事件激活开始,到End Sub(也就是这个事件结束时)为止。而变量t的有效期从过程的第一句开始,到End Sub为止。一旦超过这个有效期,变量的值就不复存在了。所以,如果想要打印出乙的苹果数,只能在使用该变量的过程中打印,超出这个过程对该变量的任何操作都是毫无意义的。
    展开全文
  • 按值传递(Byval)和地址传递(ByRef)---参数传递

    千次阅读 热门讨论 2012-08-08 11:25:21
    按值传递  ②地址传递 学到现在了,仔细想想还是很模糊,从开始接触C++中的参数传递,只知道有这么个东西,但你要是让我说明白,有点够呛,在编程序的时候呢都是记住了一些写法才不会出错,紧接着学习C语言,...

    在接触了这么多的编程语言后,似乎每个语言都要涉及到参数的传递,而参数传递过程中的两种传递方式:


    按值传递  


    ②按地址传递


    学到现在了,仔细想想还是很模糊,从开始接触C++中的参数传递,只知道有这么个东西,但你要是让我说明白,有点够呛,在编程序的时候呢都是记住了一些写法才不会出错,紧接着学习C语言,Java都是如此,最近由于学习的需要,我要进行VB的一些学习,对于这个似乎忽然理解了 下面就是我自己的一些理解,在此分享一下

     

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


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


    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中的例子来说

     

    按地址传递

    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的值都在变化。




    按值传递


    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的值仍然没有改变,这就是按值传递的小例子,就像上面图解的那样,传递过去的只是一个副本,而本身没有发生任何变化


    通过例子的观察和理解相信不懂参数传递的你也会和我一样理解了吧

    展开全文
  • value types + reference types reference types: variable store a reference to an object object is created using New variable/reference is stored on Stack, object is stored on Heap ...

    value types + reference types

    reference types:
    variable store a reference to an object
    object is created using New
    variable/reference is stored on Stack, object is stored on Heap

    Dim e1 As New Employee("Scott",True)
    Dim e2 As Employee=e1
    e2.Name="Rob"
    Dim e3 As Employee = Nothing
    Console.WriteLine(e1.GetDescription())'Rob
    Console.WriteLine(e2.GetDescription())'Rob
    Console.WriteLine(e3.GetDescription()) '?

    p.s.
    string type is a reference type, but the behaves like a value type

    pass value type by value: value type pass a copy of value
    pass reference type by value: reference type pass a copy of reference
    pass value type by reference
    pass reference type by reference 'fairly uncommon

    Sub Main()
      Dim y As Integer = 5
      Foo(y)
      Console.WriteLine(y) '5

      Dim emp As New Employee("Rob", False)
      Bar(emp)
      Console.WriteLine(emp.Name) 'Scott 'Rob

      Dim y As Integer = 5
      Foo2(y)
      Console.WriteLine(y) '10

      Dim emp As New Employee("Rob", False)
      Bar2(emp)
      Console.WriteLine(emp.Name) 'Scott 'Kate
    End Sub

    Sub Foo(ByVal x As Integer)
      x += 5
    End Sub
    Sub Bar(emp As Employee)
      'emp.Name = "Scott" 'Scott
      emp = New Employee("Scott", True) 'Rob
    End Sub

    Sub Foo2(ByRef x As Integer)
      x += 5
    End Sub
    Sub Bar2(ByRef emp As Employee)
      emp.Name = "Scott" 'Scott
      emp = New Employee("Kate", True) 'Kate
    End Sub

    展开全文
  • vb函数参数的传递

    万次阅读 2005-06-16 12:18:00
    实际上,形参的完整的语法格式应该为:[[Optional][ByVal|ByRef]|ParamArray] > [()][As 类型>][=缺省值>]ByVal表示该参数按值传递,简称值参。此时形参与实参各占一个独立的存储空间,形参的存储空间是调用时才分配...

    实际上,形参的完整的语法格式应该为:

    [[Optional][ByVal|ByRef]|ParamArray] <变量名> [()][As <类型>][=<缺省值>]

    ByVal表示该参数按值传递,简称值参。此时形参与实参各占一个独立的存储空间,形参的存储空间是调用时才分配的。如果选择值参,则实参与过程体内的运算无关,它仍保留原值。因此,为了保护实参不受过程运算的影响,应选用数值参数。

    ByRef表示该参数按地址传递,称为变量参数,简称变参。此时形参与实参共同占用同一个存储空间,而实参的存储空间是调用前就分配了的。如果选择变参,则实参与过程体内的运算有关,形参的改变会影响变参的值。因此,当被调过程需要向调用方传递两个及两个以上的值时,应选用地址传递。由于变参是VB默认的传值方式,所以在此之前,很多地方我们使用的都是变参。

    需要说明的是:如果实参为常量,就是值参了

    值传递:传递值,传递后形参和变参脱离关系 形参可能变化,但不带给实参,属于“单向传递”。此时,形参一般是变量,实参可以为常数、变量、表达式。调用时为形参分内存。

    值传递:传递值,传递后形参和变参脱离关系 形参可能变化,但不带给实参,属于“单向传递”。此时,形参一般是变量,实参可以为常数、变量、表达式。调用时为形参分内存。

    地址传递:传递地址,形参与实参用的是同一个地址,形参的变化会直接带给实参,属于 “双向传递”。此时,形参、实参一般是变量或数组。

    Option Base 1

    Private Sub Command1_Click()

        Dim a(3) As Single, b(3) As Single, c(3) As Single

        Dim x As Single, y As Single

        Dim i As Integer

        For i = 1 To 3

            a(i) = Val(InputBox("请输入第" & i & "个方程的系数a:", "输入框"))

            b(i) = Val(InputBox("请输入第" & i & "个方程的系数b:", "输入框"))

            c(i) = Val(InputBox("请输入第" & i & "个方程的系数c:", "输入框"))

            Call root(a(i), b(i), c(i), x, y)

            Print "第"; i; "个方程"; a(i); "X^2+"; b(i); "X+"; c(i); "=0的根为:"

        Next i

      Print x, y

    Call oneline

    End Sub

    Public Sub root(ByVal a As Single, _

    ByVal b As Single, ByVal c As Single, _

                 x1 As Single, x2 As Single)//vb默认的是变参

        Dim d As Single

        Dim p As Single, q As Single

        d = b * b - 4 * a * c

        p = -b / 2 / a: q = Sqr(d) / 2 / a

        x1 = p + q: x2 = p - q

    End Sub

    Public Sub oneline()

        Dim k As Integer

        For k = 1 To 40

            Print "=";

        Next k

        Print

    End Sub

     

    说明:

    ⑴a、b、c、x1、x2为形参,a(i)、b(i)、c(i)、x、y为实参。

    ⑵其中a、b、c为值参,x1、x2为变参。
    关于函数传参ByVal与ByRef之间的异同点
    -------------------------------------

    首先,两种方式得到的结果毋庸置疑,肯定是一样的.

    使用ByRef传参会改变量本身的值,而ByVal则不会,因为ByVal仅仅是将变量的副本传递到函数中.

    那么使用这两种方式传参对代码的效率会有什么影响呢?我想,这是大部分程序员所关心的.

    在默认情况下,VB是按ByRef传递参数的,在一般情况下ByVal方式要比ByRef传递参数快,但当你要传递比较大的字符串或数组时,ByRef方式就要比ByVal方式快,因为ByRef仅仅需要传递指向数据的四字节指针,而不是实际的数据.所以,在进行应用的时候,可以考虑实际情况进行处理,以便达到最佳的运行速度.


    题外话:

    长整型变量(Long)是VB中最快的变量类型.
    在做运算的时候,如果不是必须要保留小数,尽量避免使用浮点运算,因为整数运算不需要使用数字协处理器.
    尽量避免使用对象的属性代替常量进行运算,针对于任何对象属性的访问都会影响运算的速度.
    尽量使用动态数组,而避免使用静态数组,因为通过Erase方法可以清空动态数组中不需要的元素并释放出占用的内存,而对于静态数组,只能将数组中元素的内容清空,并不会释放数组元素所使用的内存.

    展开全文
  • 有多种方法可以在窗口之间传递数据,比如: 1、在模块文件(Module)中声明一个全局公共变量,然后在其他窗体中就可以通过这个变量来存取数据了,如: 在模块文件中声明变量a Public a as string 在Form1中给a赋值 a...
  • <VB.NET>自定义控件传递事件

    千次阅读 2018-02-01 10:33:47
     WithEvents TextBoxPluss As TextBox 'WithEvent一个TextBox控件,因为自定义控件中需要传递的事件为TextBox的事件  Private Sub TextBoxPlus_KeyPress(ByVal sender As System.Object, ByVal e As System....
  • VB.NET 对于类型的传递按值或者按引用,(byval byref) C# 多了个out。 有时候面试的时候我会问个小问题,嘿嘿,看看对C#基本的语法有没有熟悉。 比如 public void XXX( byval form as Form) 跟 public void ...
  • VB过程中使用的参数分为实参和形参,...当调用一个有参数的过程时,形参和实参逐一匹配传递,根据传递方式不同,可分为按值地址两种。对参数传递方式的正确判别是过程学习中的一个难点,也是等级考试中的一个考点
  • 关于VB的指针以及VB和C/C++间的参数传递

    千次阅读 多人点赞 2012-10-14 14:57:06
    首先,我们使用C/C++创建一个WIN32 DLL,这样VB才可以使用C/C++的代码。 此前我对DLL导出函数已有专文讲述,这里就不再赘述,当然为了各位能够去验证,我还是把步骤截图上来: 打开VC6,新建一个Win32 DLL工程...
  • C#之三个数排序and求平均值+按值传递引用传递

    千次阅读 热门讨论 2014-03-17 16:32:48
    在方法的声明与调用中,经常涉及方法及方法...方法参数传递按性质可以分为按值传递和按引用传递。   学习了一个输入三个数排列大小并求平均值的程序,在这个过程中来穿插着使用一下参数传递的知识。 using System;
  • 许多编程语言都有2种方法将参数传递给方法------按值传递引用传递。   与其他语言不同,Java不允许程序员选择按值传递还是引用传递各个参数,基本类型(byte--short--int--long--float--double--boolean--...
  • VB 执行CMD命令返回结果
  • VB几种函数参数传递方法,Variant,数组,Optional,ParamArray  一) 过程的参数被缺省为具有 Variant 数据类型。  1)ByRef 地址传递参数在 VB 中是缺省的 ... 按值传递参数时,传递的只是变量的副本。
  • 两个VB程序间互相通信 可以传送数值 也可以传送字节数组。
  • Application.Onkey"{Enter}","HanShu",使用这个语句实现当在特定单元格下回车键时,可以调用模块HanShu,但我现在想要通过这个语句传递参数,比如我想写成Application.Onkey"{Enter}","HanShu(CanShu1,CanShu2)...
  • VBScript代码dim mm,Result mm = 1 mm = data if mm = 1 then MsgBox "1" elseif mm = 2 then MsgBox "2" else MsgBox "other" ...Result= 123VB代码Private Sub cmdExecute_Click() Dim data As Inte
  • vb操作cmd命令行读取返回值

    热门讨论 2011-10-10 10:38:16
    vb 操作cmd命令行 读取返回值 vb 操作cmd命令行 读取返回值 vb 操作cmd命令行 读取返回值 vb 操作cmd命令行 读取返回值
  • 在《VB.NET学习笔记:窗体显示及互相传值》一文中,通过默认的窗体实例、保持窗体引用的全局性或在窗体构造函数中把窗体指针作为参数传递,这些方法都是直接操作窗体中的任何控件来读取和改变窗体内的信息。...
  • .NET中的值传递与引用传递

    千次阅读 2012-05-01 18:24:42
    今天被值传递、引用传递、值类型和引用类型搞晕了。。搜索到下面两篇信息总算是清楚了许多~ 简单说来,值传递传递的时候拷贝,就算传递的是引用类型,依然是地址的拷贝,所以之前的地址不变,交换之类的不会成功,...
  • VB 窗体间传送数据

    2014-01-23 23:04:26
    VB写了多种窗体之间传送数据的例子教材,非常适合初学者学习 可以比较多种方法之间的区别
  • VB传递数组参数

    千次阅读 2008-01-10 01:08:00
    Public Sub 第一个工程() MsgBox "这是我的第一个过程" Dim arrND(0 To 1, 0 To 1) As Variant arrND(0, 0) = "Sample.vsd" arrND(0, 1) = "111" arrND(1, 0) = "222" arrND(1, 1) = "333" CreateDrawing (ar
  • [color=red]byref:缺省方式,地址传[/color],例如函数A调用函数B,地址...[/color]例如函数A调用函数B,按值传递变量c作为参数,传递后不管B在执行过程中是否改变c的值,A中c的值保持调用B之前的值不变。 ...
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    “&”位与 两个二进制都为1,则该位的结果为1,否则为零 【 零的位取反是 -1(0在数学界既不是正数也不是负数) 所有正整数的位取反是其本身+1的负数 所有负整数的位取反是其本身+1的绝对值 】 30....
  • 再说一说VB6到VB2008/VB2010升级向导的问题: 原VB6代码: Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved...
  • 传址: Dimarr1()AsObject={"string1","string2","string3"}Dimarr2()AsObject=arr1传值: Dimarr1()AsObject={"string1","string2","string3"}Dimarr2()AsObjectReDimarr2(arr1.Lengt...
  • 用HttpAnalyzer跟踪,发现服务器Set-Cookie时,有时候cookie的没有Version=1,有时候则有Version=1。 只要返回的Cookie里包含Version=1,则Request的CookieContainer就读不到这个cookie。 既然读不到Cookie...
  • vb6中判断一个变量是否为空

    千次阅读 2020-09-17 14:08:31
    vb6中存在几个虚幻的:Null、Missing、Empty、Nothing、vbNullString。除了最后一个之外,每一个都不能直接用“a=”来判断。下面分别解释一下这几个的含义。 1、Null。 Null指一个不合法的数据,判断一个...
  • 1、在form1中要打开form2时(form1与form2均为类)  new form2 = New Form2();...注: ShowDialog()显示模式窗体 Show()显示非模式窗体 根据具体情况使用2、form之间传递参数例如: 在From2中有个属性 pr
  • 画太极八卦图的VB源码,实现在窗口上画一个不断旋转的太极图,创建刷子(参数:颜色)返回值:刷子句柄,传递设备(参数:图片句柄,设备句柄)返回值:传递后ID,删除设备(参数:设备句柄)返回值:成功或失败信息[删除前需要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,376
精华内容 8,950
关键字:

vb按值传递