精华内容
下载资源
问答
  • VB过程中使用的参数分为实参和形参,...当调用一个有参数的过程时,形参和实参逐一匹配传递,根据传递方式不同,可分为按值和按地址两种。对参数传递方式的正确判别是过程学习中的一个难点,也是等级考试中的一个考点
  • 内容索引:VB源码,系统相关,文件夹浏览 VB使用两种方式实现文件夹浏览,第一种是使用文件夹名浏览,第二种则使用文件夹的PIDL浏览,使用文件夹的pidl 来预先选择文件夹,释放GetPIDLFromPath调用中设置的pidl、释放...
  • 如:VB :默认为地址传递,可以指定用值传递C: 普通方式实现值传递,指针方式实现地址传递C++:比 C 多了引用传递,本质上是地址传递Fortran: 默认为地址传递,可以指定使用值传递两种传递方式的区别:1....

    转载一篇好文章,小修改了下,2011年新写的,强大~

    在各种语言中,输入参数传递方法(地址传递、值传递)各有不同。如:

    VB :默认为地址传递,可以指定用值传递

    C: 普通方式实现值传递,指针方式实现地址传递

    C++:比 C 多了引用传递,本质上是地址传递

    Fortran: 默认为地址传递,可以指定使用值传递

    两种传递方式的区别:

    1. 用地址传递方式可以在函数内部修改传入的参数值,而值传递不可以。

    2. 值传递需要对输入的参数进行拷贝,复杂的数据结构值传递时会降低程序执行的效率。

    那么MATLAB的函数参数究竟用哪一种方式呢?

    查看帮助文档得到结果:如果函数内部试图修改输入参数的值则为值传递,如果没有修改则为地址传递。

    采用这一处理方式的目的是:

    1. 不允许函数内部修改输入参数的值

    2. 兼顾执行效率(地址传递不需要将输入参数拷贝一份)

    那么我们可不可以去验证一下呢?

    首先我们需要借助一个mex函数,该函数的功能就是改变输入参数的数值,由于该函数是借助mex方式实现的,所以MATLAB无法检测到我们修改了输入参数的值。

    以下是该mex函数的代码:mexChangeValue.cpp

    #include "mex.h"

    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    {

    if(nrhs != 1)

    {

    mexErrMsgTxt("需要一个输入参数!");

    }

    if(mxIsEmpty(prhs[0]) || !mxIsDouble(prhs[0]))

    {

    mexErrMsgTxt("输入参数必须为非空 Double 类型!");

    }

    double *pValue = mxGetPr(prhs[0]);

    pValue[0] = 1.2;

    }

    然后开始做实验:

    function ArgTest

    clc

    a = 0;

    fun1(a);

    disp(a);

    b = 0;

    fun2(b);

    disp(b);

    function fun1(a)

    % 更改输入参数的值为 3,此时MATLAB做一份外部输入参数的拷贝

    a = 3;

    % 用mex方式将输入参数的值改为 1.2,因为做了一份拷贝,所以并没有更改外部参数的值

    mexChangeValue(a);

    function fun2(b)

    % 用mex方式将输入参数的值改为 1.2,还没有做拷贝,更改了外部参数的值

    mexChangeValue(b);

    % 此时做了外部参数的一份拷贝,但为时已晚,外部参数的值已经被更改了

    b = 3;

    我们可以看到输出结果为:

    0

    1.2000

    a 的值没有改变,而 b 的值被改变了,说明在 fun1 中 "a = 3;" 之后,对输入参数 a 做了一份拷贝,变为“值传递”,而在 fun2 中刚开始进入函数时是“地址传递”的。

    结论:

    1. 在改变输入参数的值之前是“地址传递”的,在改变输入参数的值之后变为“值传递”。

    2. 我们在编写函数时,尽量不要对输入参数重新赋值,尤其是对复杂的数据,这样会降低执行效率。

    展开全文
  • 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方法可以清空动态数组中不需要的元素并释放出占用的内存,而对于静态数组,只能将数组中元素的内容清空,并不会释放数组元素所使用的内存.

    展开全文
  • 种VB窗体之间简单的参数传递方法

    千次阅读 2008-09-04 14:57:00
    假设有个窗体 form1 和form2,form1打开form2时必须将一个值传递给form2,实现该参数传递的方法如下: 首先在form2定义一个变量,如下 public nt as string 然后在form1中给该变量赋值,如下 form2.nt="aaa" ...

     假设有两个窗体 form1 和form2,form1打开form2时必须将一个值传递给form2,实现该参数传递的方法如下:

     

    首先在form2定义一个变量,如下

      public nt as string

     

    然后在form1中给该变量赋值,如下

     

      form2.nt="aaa"

     

      form2.show

     

    如此,即将“aaa”传递给了form2.

    展开全文
  • c语言:字符串做为函数参数传递

    千次阅读 2021-05-20 10:57:55
    1、值传递void swap(int x,int y){ int temp = x;x = y;y = temp;}void main(){int a = 10, b = 20;swap(a, b);}执行后,并不会交换。2、引用传递void swap(int &x,int &y){ int temp = x;x = y;y = temp;}...

    1、值传递

    void swap(int x,int y)

    {    int temp = x;

    x = y;

    y = temp;

    }void main()

    {

    int a = 10, b = 20;

    swap(a, b);

    }

    执行后,并不会交换。

    2、引用传递

    void swap(int &x,int &y)

    {    int temp = x;

    x = y;

    y = temp;

    }void main()

    {

    int a = 10, b = 20;

    swap(a, b);

    printf("a=%d\nb=%d\n", a, b);

    }

    执行后,发生交换。

    3、指针传递

    void swap(int *x,int *y)

    {    int temp = *x;    *x = *y;    *y = temp;

    }void main()

    {

    int a = 10, b = 20;

    swap(&a, &b);

    printf("a=%d\nb=%d\n", a, b);

    }

    执行后,发生交换。

    参数传递只有上面三种,但是如果加上数组,就会产生几种新形式。

    首先,明确数组型变量名本身只是该数组所占存储空间的首地址:

    int a[3] = { 1, 2, 3 };    int *p = a; //等价于下行    //int *p = &a[0];

    printf("%d", *p);

    典型的数组做参数。

    void fun(char s[]){    for (int i = 0; s[i] != '\0'; i++)

    printf("%c", s[i]);

    }void main()

    {    char str[] = "Hello World!";

    fun(str);

    }

    函数调用时,这里系统不会为形参分配数组存储空间,而是仅仅分配一个存放数组地址(第一个元素地址)的存储空间,此后,将实参数组的首地址传递给形参变量。

    其实本质与下相同,只不过还是数组形式的(数组名代替指针)。

    既然数组型变量名本身只是该数组所占存储空间的首地址,我们当然可以用指针做形参来接收数组实参。

    void fun(char *p){    while (*p)

    {

    printf("%c", *p);

    p++;

    }

    }void main()

    {    char str[] = "Hello World!";

    fun(str);

    }

    不过问题是如果这样,无法把握数组结束(除非知道数组长度)。而对于字符数组(上例),由于字符串末尾有结束标志'\0'(ascii码正好是0),所以就很容易利用指针来判断字符串是否结束。

    afc10c42b61e74f0e33cb5d74b17dfa6.png

    扩展资料:

    调用带参数的函数:

    在调用函数时,可以向其传递值,这些值被称为参数。

    这些参数可以在函数中使用。

    可以发送任意多的参数,由逗号 (,) 分隔:

    myFunction(argument1,argument2)。

    当声明函数时,请把参数作为变量来声明:

    function myFunction(var1,var2){这里是要执行的代码}。

    变量和参数必须以一致的顺序出现。第一个变量就是第一个被传递的参数的给定的值,以此类推。

    按值传递参数:

    按值传递参数时,是将实参变量的值复制一个到临时存储单元中,如果在调用过程中改变了形参的值,不会影响实参变量本身,即实参变量保持调用前的值不变。

    按值传递参数时,需要在参数名前加"ByVal"关键字。

    按地址传递参数:

    按地址传递参数时,把实参变量的地址传送给被调用过程,形参和实参共用内存的同一地址。在被调用过程中,形参的值一旦改变,相应实参的值也跟着改变。

    如果实参是一个常数或表达式,Visual Basic 6.0会按"传值"方式来处理,按地址传递不需要"ByVal"关键字。

    按数组传递参数:

    在VB6.0中,允许使用数组作为实参传递到子过程的形参中,数组传递必须采用地址传递的方式来传递参数。数组参数在传递时应注意以下两个方面:

    ① 在实参和形参列表中只写数组名,忽略维数的定义,但圆括号不能省,当数组作为参数传递时,系统将实参数组的起始地址传给过程,使形参数组也具有与实参数组相同的起始地址,若参数是多维数组,每维以逗号分隔。

    ② 被调过程可分别通过Lbound和Ubound函数确定实参数组的下界和上界。

    展开全文
  • vb中函数的调用与参数传递

    千次阅读 2010-12-14 20:54:00
    <br />形参如果是数组必须加小括号 如:定义过程 sub em( pay() as Single) 调用过程 em(xu()) 按值传递(ByVal):形参和实参占有不同的存储空间,调用过程改变了形参变量的值,实参的值...
  • VB自定义类型参数传递

    千次阅读 2012-07-08 21:12:06
    这里介绍VB自定义类型参数传递,用户自定义类型在VB中是一重要的数据类型,它为编程者提供了很大的灵活性,使开发人员可以根据需要构造自己的数据结构。 AD: 本文向大家介绍VB自定义类型参数...
  • 介绍了如何在VB中调用C/C++写的dll以及如何传递数组参数
  • 主程序调用子程序是,往往需要向子程序传递一些参数,同样,子程序运行的时候也需要把一些结果参数传回给主程序,主程序与子程序之间的这种信息传递称为参数传递,我们把主程序传给子存续的参数称为子程序的入口参数...
  • MYSQL存储过程VB调用方法。Private Sub Command1_Click()Dim MyComm As New ADODB.Command '定义一个命令对象Dim Rs_GetList As New ADODB.Recordset '定义一个记录集对象Dim param As ADODB.Parameter '定义一个...
  • VB键盘事件shift参数vb*mask

    千次阅读 2016-11-26 12:43:09
    VB 键盘按键事件的shift参数以及vbshiftmask,vbctrlmask,vbaltmask前瞻:1.shift参数值表 以及 vb*mask 值表2.ShiftDown=(Shift And vbShiftMask)>0如何理解正文:1.shift参数值表 以及 vb*mask 值表比如这个函数...
  • VBA实现FTP上传文件的两种方式:①shell cmd命令②vba调用vb.net(传参并获取返回值) 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以...
  • 按值传递(Byval)和按地址传递(ByRef)---参数传递

    千次阅读 热门讨论 2012-08-08 11:25:21
    在接触了这么多的编程语言后,似乎每个语言都要涉及到参数的传递,而参数传递过程中的两种传递方式: ①按值传递  ②按地址传递 学到现在了,仔细想想还是很模糊,从开始接触C++中的参数传递,只知道有...
  • 再看第10行,对于过程B,它的参数传递方式使用了ByVal关键字(即传值) 对于ByVal(传值),参数t和x根本就是不相关的个变量。就如同个人一样(以甲、乙为例),起初甲有个苹果,然后甲告诉乙,你现在也有个...
  • 最近正在用C#编写一个管理程序,由于用到了MFC编写的一个控件,...其中涉及到几个函数,比较典型的一个在MFC中(标准C++中的引用表示方式)的函数表示如下:bool GetCurItem(int &startHour, int &startMin,int &endHo
  • 就是我们为什么要把一个函数的地址作为参数传递给另一个参数。要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么还要用这么麻烦的办法去把函数当做参数来传递呢。下面我举个例子。 ...
  • Asp.Net MVC中的@model与Model讲解了后台控制器如何向前台页面传递数据,今天就接着为大家讲解前台View页面向后台Controller控制器传递数据的几种方式。这几种方式是我在实际中使用并总结的,如果那个地方说的不对或...
  • 比如下面两种写法都可以 ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsm" ThisWorkbook.SaveCopyAs (ThisWorkbook.Path & "\" & ActiveSheet.Name & ".xlsm") 也...
  • VB.NET机房重构】数据传递----实体、DataTable、泛型

    千次阅读 热门讨论 2015-06-11 21:17:59
    泛型是程序设计语言的一特性。泛型结合类可以将类型参数用做它所存储的对象的类型的占位符。类型参数作为其字段的类型和其方法的参数类型出现。这样说可能有些抽象,那就从最开始的实体来举例吧。 一直不能理解我...
  •  今天上午学习vb关于过程的这一章节时,在敲书中例子时,由于我的不小心,把其中个代码给敲错了,引发了下面图中的问题。  然后,我就去查找相关资料,寻求什么叫ByRef参数类型不符,它代表的含义是什么...
  • 在《VB.NET学习笔记:窗体显示及互相传值》一文中,通过默认的窗体实例、保持窗体引用的全局性或在窗体构造函数中把窗体指针作为参数传递,这些方法都是直接操作窗体中的任何控件来读取和改变窗体内的信息。...
  • VB模拟键盘输入的N方法

    千次阅读 2017-10-17 09:01:25
    VB模拟键盘事件的N方法 键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作。但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用...
  • 二、 javabean 的两种使用方式:(嵌入 java 代码方式和使用 jsp 标记符方式)【也就是当作普通的类来使用或者在 jsp 中 页面处理时有特殊的标记符处理方式】 以下是使用 javabean 的每个功能的两者不同方式比较:...
  • 当在查询的时候需要传入多个参数的时候该怎么办呢:1,封装成一个Model对象,底层HashMap还是一个User user=new User();user.setUserName("zhangsan");user.setPassword("123456");queryUserByuserNameAndPass(user);//...
  • Function是函数,sub是子程序,都可以传递bai参数,但函数有返回值,子程序没有 function 可以用自身名字返回一个值,sub 需定义别的变量,用传址方式传回值。 Sub 过程与Function 过程的区别: 1. Sub 过程定义时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,781
精华内容 7,512
关键字:

vb参数传递的两种方式