精华内容
下载资源
问答
  • 关于 byval 与 byref 的区别分析总结
  • ByRef和ByVal

    2016-06-06 12:22:51
    byref byval

    PK

    ByRef:

        我们常说的传地址,也就是用一旦在使用过程中改变了引用的数值,那么原数值做相应的改变。可以说ByRef用的随波逐流。

    ByVal:

        所谓的传值;无论在使用过程中如何操练所引用的数值,原数值就不会有任何变化。ByVal用的刚正不阿啊。

    举例:

        例如A过程ByRef了一个值为10的a,若A过程在使用a的时候将a重新赋值为5,那么a的值就会变为5;而假若A过程ByVal了一个值为10的a,不管A过程在使用a的时候对a重新赋值多少次,a的值都会保持10不变。

    代码

    ByRef

    <span style="font-family:KaiTi_GB2312;font-size:24px;"> Sub ByR(ByRef x As Integer)
            x = 1
        End Sub
        Private Sub btnByRef_Click(sender As Object, e As EventArgs) Handles btnByRef.Click
         
            Dim a As Integer = 5
            ByR(a)
            txtByRef.Text = a
    
        End Sub</span>


    ByVal

    <span style="font-family:KaiTi_GB2312;font-size:24px;">  Sub ByV(ByVal x As Integer)
            x = 1
        End Sub
        Private Sub btnByVal_Click(sender As Object, e As EventArgs) Handles btnByVal.Click
    
    
            Dim a As Integer = 5
            ByV(a)
            txtByVal.Text = a
    
        End Sub</span>

    结果


    小结

        通过结果可以看到,我们在将a=5传入参数传递方式为ByRef的过程中后将地址一并传入,从而导致自身的值被改为ByR中的1;
    而在将a=5传入参数传递方式为ByVal的过程中后只是将值传入,并没有将自身的值改为ByV中的1。
        如果要想保护参数的安全性,建议使用ByVal;而若进行数据导入导出时建议ByRef。
    感谢您的宝贵时间,祝您生活愉快。
    ——joker
    展开全文
  • lv-ByRef-回调示例
  • asp中Byval与Byref的区别

    2021-01-01 16:35:56
    ByRef.asp 具体代码: <%Sub TestMain()Dim A : A=5Call TestBy(A)Response.write AEnd SubSub TestBy(ByVal T)T=T+1End subcall TestMain()%> <%Sub TestMain()Dim A : A=5Call TestBy(A)Response...
  • 介绍了.Net 下区别使用 ByRef/ByVal 的重要性,有需要的朋友可以参考一下
  • Byval 和 ByRef 使用

    2019-08-11 01:43:31
    Byval 和 ByRef 使用 byval 单单传参数. byref 如果定义了一个参数指向它,他会那值传回来. 说得不是很清楚! 在 Visual Basic 中,可以通过分别指定关键字 ByVal 或 ByRef,“通过值”或“通过引用”将...
    Byval 和 ByRef 使用

    byval 单单传参数.
    byref 如果定义了一个参数指向它,他会那值传回来.
    06.gif说得不是很清楚!

    在 Visual Basic 中,可以通过分别指定关键字 ByValByRef,“通过值”或“通过引用”将参数传递给过程。通过值传递参数意味着过程不能在呼叫代码中修改参数的基础变量元素的内容。通过引用传递允许过程以呼叫代码本身可以使用的相同方法来修改变量元素的内容。

    通过值和通过引用传递参数之间的差别与将数据类型分为值类型和引用类型不同。但是,两种类别确实相互影响。

    如果使用关键字 ByRef 通过引用传递变量参数,则过程能够修改变量本身。具体说来,如果参数为对象变量,则可以给它分配新的对象。这种重新分配也会影响到调用程序中的对象变量。

    传递 ByVal 的参数所提供的示例中,如果 Replace 子例程改为通过引用获取参数数组,则新数组 K() 将会分配给呼叫代码中的数组变量 N。N() 的结果将会是如下所示:

    MsgBox("After Replace(N) taking A() argument ByRef: " & _
                  CStr(N(0)) & CStr(N(1)) & CStr(N(2)) & CStr(N(3)))
    ' The element values of N() are now 101, 201, and 301. Because N was 
    ' passed ByRef, Replace could modify the variable N and assign a new 
    ' array to it. Because N is a reference type, Replace could also change 
    ' its members

    转载于:https://www.cnblogs.com/T_98Dsky/archive/2005/04/22/143260.html

    展开全文
  • VB中形参声明有两种方式,一种是ByVal,一种是ByRef,如果是ByVal则在传递参数时将实参的一个拷贝传递给子程序,子程序对参数的修改不会影响原有参数。如果是ByRef,则将实参的指针传递给子程序,子程序对参数的修改...
  • ByVal与ByRef

    热门讨论 2017-03-19 20:59:53
    Byval 是按值传送,在传的过程中不会改变原来的值,仅仅传送的是一个副本,而 Byref 相反,从内存地址来说,后者是同一个内存地址 ByVal为传值,当你把函数外的一个变量,如n传给ByVal的参数时,在函数体内对该参数所做...

    一个是按址传递,一个是按值传递。。可是在函数调用的题中搞不太清楚了。。。

    这是vb中传值与传址的参数修饰

    Byval 是按值传送,在传的过程中不会改变原来的值,仅仅传送的是一个副本,而 Byref 相反,从内存地址来说,后者是同一个内存地址
    ByVal为传值,当你把函数外的一个变量,如n传给ByVal的参数时,在函数体内对该参数所做的任何变更,不会影响函数体外的这个n变量的值

    而ByRef为传地,即把函数体外变量n的地址传给ByRef的函数参数,这样,你在函数内容对该参数所做的变更就会体现在函数体外部的这个变量n上,也就是,你在函数内容把它变更的话,函数体外部的它也会跟着变


    BYREF 是在过程中使用的数值和外面的数值相等了,并且一旦在过程中改变了这个数值,那么引用过程的数值也修改了。一般来说缺省就是BYREF。
    优点:节约一个内存地址的大小,并且实现数值的修改

    BYVAL 是为这个变量在内存中重新开辟一个地址进行存储。在过程中修改这个数值不会影响这个数值。

    简单来说Byval是传值,Byref是传地址,ByVal :表示该参数是按值方式传递的。ByRef :表示该参数按引用方式传递。下面小编为大家详细介绍Byval 和Byref的区别。

    1、引用参数(ref)在可以作为引用参数在函数成员调用中传递之前,必须已明确赋值,而输出参数(out)在可以作为输出参数在函数成员调用中传递之前不一定要明确赋值,在该函数成员正常返回前都必须已明确赋值。

    2、在函数内部,引用参数(ref)被视为初始已赋值,输出参数(out)被视为初始未赋值。

    3、默认地,VB中的所有参数都是值传递。只有在参数的修饰符中明确包含out或ref,才是引用传递。但是需要知道的是,当参数的类型是引用类型时,你传递的是一个对象的引用而不是实际的对象。


    展开全文
  • VT_BYREF

    千次阅读 2016-04-19 13:06:30
    前言如果使用变体类型的出参,必须指定VT_BYREF和数据类型的或typedef struct FARSTRUCT tagVARIANT VARIANT; typedef struct FARSTRUCT tagVARIANT VARIANTARG;typedef struct tagVARIANT { VARTYPE vt; unsigned...

    前言

    如果使用变体类型的出参,必须指定VT_BYREF和数据类型的或

    typedef struct FARSTRUCT tagVARIANT VARIANT;
    typedef struct FARSTRUCT tagVARIANT VARIANTARG;
    
    typedef struct tagVARIANT  {
       VARTYPE vt;
       unsigned short wReserved1;
       unsigned short wReserved2;
       unsigned short wReserved3;
       union {
          Byte                    bVal;                 // VT_UI1.
          Short                   iVal;                 // VT_I2.
          long                    lVal;                 // VT_I4.
          float                   fltVal;               // VT_R4.
          double                  dblVal;               // VT_R8.
          VARIANT_BOOL            boolVal;              // VT_BOOL.
          SCODE                   scode;                // VT_ERROR.
          CY                      cyVal;                // VT_CY.
          DATE                    date;                 // VT_DATE.
          BSTR                    bstrVal;              // VT_BSTR.
          DECIMAL                 FAR* pdecVal          // VT_BYREF|VT_DECIMAL.
          IUnknown                FAR* punkVal;         // VT_UNKNOWN.
          IDispatch               FAR* pdispVal;        // VT_DISPATCH.
          SAFEARRAY               FAR* parray;          // VT_ARRAY|*.
          Byte                    FAR* pbVal;           // VT_BYREF|VT_UI1.
          short                   FAR* piVal;           // VT_BYREF|VT_I2.
          long                    FAR* plVal;           // VT_BYREF|VT_I4.
          float                   FAR* pfltVal;         // VT_BYREF|VT_R4.
          double                  FAR* pdblVal;         // VT_BYREF|VT_R8.
          VARIANT_BOOL            FAR* pboolVal;        // VT_BYREF|VT_BOOL.
          SCODE                   FAR* pscode;          // VT_BYREF|VT_ERROR.
          CY                      FAR* pcyVal;          // VT_BYREF|VT_CY.
          DATE                    FAR* pdate;           // VT_BYREF|VT_DATE.
          BSTR                    FAR* pbstrVal;        // VT_BYREF|VT_BSTR.
          IUnknown                FAR* FAR* ppunkVal;   // VT_BYREF|VT_UNKNOWN.
          IDispatch               FAR* FAR* ppdispVal;  // VT_BYREF|VT_DISPATCH.
          SAFEARRAY               FAR* FAR* pparray;    // VT_ARRAY|*.
          VARIANT                 FAR* pvarVal;         // VT_BYREF|VT_VARIANT.
          void                    FAR* byref;           // Generic ByRef.
          char                    cVal;                 // VT_I1.
          unsigned short          uiVal;                // VT_UI2.
          unsigned long           ulVal;                // VT_UI4.
          int                     intVal;               // VT_INT.
          unsigned int            uintVal;              // VT_UINT.
          char FAR *              pcVal;                // VT_BYREF|VT_I1.
          unsigned short FAR *    puiVal;               // VT_BYREF|VT_UI2.
          unsigned long FAR *     pulVal;               // VT_BYREF|VT_UI4.
          int FAR *               pintVal;              // VT_BYREF|VT_INT.
          unsigned int FAR *      puintVal;             //VT_BYREF|VT_UINT.
       };
    };
    

    例子

    void fnTest2() {
        HRESULT hr = S_FALSE;
        LONG lRc = 0;
        CLSID clsid;
        BSTR bstrStr = NULL;
        IUnknown* pUnk = NULL;
        IDispatch* pDispatch = NULL;
        OLECHAR* szFunction = NULL;
        DISPID dispid;
        DISPPARAMS dispparams = {NULL, NULL, 0, 0};
        VARIANT var[10];
        VARIANT varRc[10];
        LONG lVal[10] = {0};
    
        do {
            hr = CLSIDFromProgID(OLESTR("MyStringComDll.MyString.1"), &clsid);
            if (FAILED(hr)) {
                break;
            }
    
            hr = CoCreateInstance(CLSID_MyString, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnk);
            if (FAILED(hr)) {
                break;
            }
    
            hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pDispatch);
            if (FAILED(hr)) {
                break;
            }
    
            szFunction = OLESTR("test");
            /// 出参 dispid 为虚表中length函数对应的索引项
            hr = pDispatch->GetIDsOfNames(IID_NULL, &szFunction, 1, LOCALE_USER_DEFAULT, &dispid);
            if (FAILED(hr)) {
                break;
            }
    
            /// 使用出参的例子, 要使用VARIANT.pX, VARIANT.vt 必须是VT_BYREF | VT_数据类型
            var[0].vt = VT_BYREF | VT_I4;
            var[0].plVal = &lVal[1];
    
            var[1].vt = VT_BYREF | VT_I4;
            var[1].plVal = &lVal[0];
    
            dispparams.rgvarg = var;
            dispparams.rgdispidNamedArgs = NULL; 
            dispparams.cArgs = 2;
            dispparams.cNamedArgs = 0;
    
            hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT,
                           DISPATCH_METHOD, &dispparams, varRc, NULL, 
                           NULL);
            if (FAILED(hr)) {
                break;
            }
    
            wprintf(L"all ok\n");
        } while (0);
    
        if (NULL != pDispatch) {
            pDispatch->Release();
        }
    
        if (NULL != pUnk) {
            pUnk->Release();
        }
    }
    

    COM接口定义与实现

    // MyStringComDll.idl : IDL source for MyStringComDll.dll
    //
    
    // This file will be processed by the MIDL tool to
    // produce the type library (MyStringComDll.tlb) and marshalling code.
    
    import "oaidl.idl";
    import "ocidl.idl";
        [
            object,
            uuid(DEA21FB9-6309-4B7C-BA39-453685F6B081),
            dual,
            helpstring("IMyString Interface"),
            pointer_default(unique)
        ]
        interface IMyString : IDispatch
        {
            [id(1), helpstring("字符串赋值")] HRESULT assignment([in] LPOLESTR lpszSrc);
            [id(2), helpstring("字符串是否相等,靠出参返回")] HRESULT isEqual([in] LPOLESTR lpszSrc, [out]LONG* lplRc);
            [id(3), helpstring("字符串是否不相等")] HRESULT isNotEqual([in] LPOLESTR lpszSrc, [out]LONG* lplRc);
    
            [id(4), helpstring("字符串是否<入参字符串")] HRESULT isLessThan([in] LPOLESTR lpszSrc, [out]LONG* lplRc);
            [id(5), helpstring("字符串是否<=入参字符串")] HRESULT isLessThanOrEqual([in] LPOLESTR lpszSrc, [out]LONG* lplRc);
    
            [id(6), helpstring("字符串是否>入参字符串")] HRESULT isGreateThan([in] LPOLESTR lpszSrc, [out]LONG* lplRc);
            [id(7), helpstring("字符串是否>=入参字符串")] HRESULT isGreateThanOrEqual([in] LPOLESTR lpszSrc, [out]LONG* lplRc);
    
            [id(8), helpstring("字符串是为空")] HRESULT isEmpty([out]LONG* lplRc);
            [id(9), helpstring("附加一个字符串")] HRESULT Appends([in] LPOLESTR lpszSrc);
    
            [id(10), helpstring("求字符串长度")] HRESULT length([out]LONG* lplRc);
            [id(11), helpstring("得到字符串")] HRESULT GetString([out]BSTR* lpBstrStr);
            [id(12), helpstring("method test")] HRESULT test([out] long* lRc1, [out] long* lRc2 );
        };
    
    [
        uuid(3F08DFAB-AF55-45DE-93D4-8120F9C67D44),
        version(1.0),
        helpstring("MyStringComDll 1.0 Type Library")
    ]
    library MYSTRINGCOMDLLLib
    {
        importlib("stdole32.tlb");
        importlib("stdole2.tlb");
    
        [
            uuid(26EF0212-1BF7-4E01-9988-37AD60087846),
            helpstring("MyString Class")
        ]
        coclass MyString
        {
            [default] interface IMyString;
        };
    };
    
    // MyString.h : Declaration of the CMyString
    
    #ifndef __MYSTRING_H_
    #define __MYSTRING_H_
    
    #include "resource.h"       // main symbols
    #include <comdef.h> ///< for _bstr_t
    
    /////////////////////////////////////////////////////////////////////////////
    // CMyString
    class ATL_NO_VTABLE CMyString : 
        public CComObjectRootEx<CComSingleThreadModel>,
        public CComCoClass<CMyString, &CLSID_MyString>,
        public IDispatchImpl<IMyString, &IID_IMyString, &LIBID_MYSTRINGCOMDLLLib>
    {
    public:
        CMyString()
        {
            m_bstrStr = OLESTR("");
        }
    
    DECLARE_REGISTRY_RESOURCEID(IDR_MYSTRING)
    
    DECLARE_PROTECT_FINAL_CONSTRUCT()
    
    BEGIN_COM_MAP(CMyString)
        COM_INTERFACE_ENTRY(IMyString)
        COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()
    
    // IMyString
    public:
        STDMETHOD(test)(/*[out]*/ long* lRc1, /*[out]*/ long* lRc2 );
        STDMETHOD(isNotEqual)(/*[in]*/ LPOLESTR lpszSrc, /*[out]*/LONG* lplRc);
        STDMETHOD(assignment)(/*[in]*/  LPOLESTR lpszSrc);
        STDMETHOD(isEqual)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);
    
        STDMETHOD(isLessThan)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);
        STDMETHOD(isLessThanOrEqual)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);
    
        STDMETHOD(isGreateThan)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);
        STDMETHOD(isGreateThanOrEqual)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);
    
        STDMETHOD(isEmpty)(/*[out]*/ LONG* lplRc);
        STDMETHOD(Appends)(/*[in]*/  LPOLESTR lpszSrc);
    
        STDMETHOD(length)(/*[out]*/ LONG* lplRc);
        STDMETHOD(GetString)(/*[out]*/ BSTR* lpBstrStr);
    
        /// 私有成员变量
    private:
        _bstr_t m_bstrStr; ///< 保存外面传来的字符串
    };
    
    #endif //__MYSTRING_H_
    
    STDMETHODIMP CMyString::test(long *lRc1, long *lRc2)
    {
        if ((NULL == lRc1) || (NULL == lRc2)) {
            return ERROR_INVALID_PARAMETER;
        }
    
        *lRc1 = 0x1111;
        *lRc2 = 0x2222;
    
        return S_OK; ///< invoke时,返回的hr并不是这里的返回值
    }
    
    展开全文
  • PlantSimulation中Byref的应用 您可以使用关键字byref传递参数作为参考。 这意味着Plant Simulation不会将值复制到参数中,而是被调用的方法直接访问被调用的变量。 关键字byref可以将多个结果返回给调用方法。 ...
  • ByRef 传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。 ByVal是传递值 源数据不会被修改 你可以把这个值当作自己的局部变量来使用 ByRef是传递...
  • ByVal 传送参数内存的一个拷贝给被调用者。也就是说,栈中压入的直接就是所传的值。 ByRef 传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。
  • ByVal和ByRef区别

    2015-12-30 16:47:04
    ByVal和ByRef区别在VBA过程中,参数传递有两种方式:ByVal和ByRefByRef: 按地址传递,改变原先传递参数的变量的值。当没有任何声明的时候,采取此方式传递参数。ByRef常用在递归中。ByVal: 按值传递,仅将变量...
  • ByVal和ByRef的区别

    2019-09-24 01:23:55
    如果我们给ByRef参数传递一个变量,这个参数将引用原始的变量,任何对这个变量有赋值的地方将影响被传入的变量本身. 默认情况下, 参数传递方式为ByRef. 转载于:https://www.cnblogs.com/dushuai/articles/253...
  • byRef 与 byVal

    2013-09-03 15:55:10
    ByRef是传递地址,源数据可能被修改,你对这个变量的操作将对你传入的那个变量产生影响,就像指针的感觉。Sub add1(byval no )no = no + 100End SubSub add2(byref no) no = no +100End SubDim a a = 100Call a...
  • 主要介绍了在JS中函数参数是传值(byVal)还是传址(byRef)的误区我们通过实例说明一下,有需要的朋友可以参考
  • vb中ByRef参数类型不符

    千次阅读 热门讨论 2018-02-22 21:10:35
    在机房收费系统中上机的时候总是提醒vb中ByRef参数类型不符,这是怎么回事呢? 【分析】 第一个类型 传递参数未定义类型,假如参数在调用前未定义类型,系统自动将他定义为variant类型,由于和过程或函数中的对...
  • vb6里面的byref可以添加在数组类型变量上么?数组可以代替函数使用byref实现变量的共享么?怎么写语法才能通过?
  • VB中Byval和byref的区别

    2019-03-20 09:47:01
    在VB中Byval 和byref怎么区别?简单来说Byval是传值,byref是传地址,ByVal :表示该参数是按值方式传递的。ByRef :表示该参数按引用方式传递。下面绿茶小编为大家详细介绍Byval 和byref的区别。 1、引用参数(ref)在...
  • ctypes 指针类型 byref pointer POINTER

    千次阅读 2019-12-28 21:49:52
    byref 并不会构造一个指针对象,因此速度比 pointer 快,只能作为导出函数的实参使用。其 _obj 是只读属性,不能更改。 pointer 会构造一个指针对象。.contents 属性即其所指的对象,但是指向是能够变动的。相当于 ...
  • ByVal 关键字的参数是值传参,ByRef 关键字的参数是地址传参。ByVal的参数,是指定参数类型的值,不会改变传参对象的原地址值;ByRef的参数,是指定原地址入参,是直接使用原地址对象,如果在方法里修改该对象的话,...
  •  然后,我就去查找相关资料,寻求什么叫ByRef参数类型不符,它代表的含义是什么?在什么情况下会造成ByRef参数类型不符?    1.传递传递参数未定义类型,如果参数在调用前未定义类型,系统自动将它...
  • byref() argument must be a ctypes instance

    千次阅读 2018-03-05 11:08:39
    sessionID = dll.QTTSSessionBegin(session_begin_params, byref(ret)) byref(n)返回的相当于C的指针右值&amp;n,本身没有被分配空间:&gt;&gt;&gt; from ctypes import * &gt;&gt;&gt...
  • Byval和ByRef

    2012-02-09 14:23:26
    用现实例子做比: 同学A 同学B,A有一本书,B没有 ...按地址传递ByRef A把书给B,他们同看一本书。 只是一些我的看法,肯定很不全面,大家多提意见啊 PS:网易博客数据载入异常,写不了博客什么原因
  • VB中ByVal与ByRef有什么区别 ByVal 与 ByRef(默认值)这两个是子过程的参数传递时,指定参数按什么传递的ByVal(按值传递)ByRef(按地址传递)具体这样来理解:过程中的参数列表,我们称形参调用过程时的参数列表,我们称...
  • VB中 ByRef与ByVal区别

    2019-09-22 08:53:15
    函数调用的参数传递有“值传递”和“引用传递”两种传递方式。如果采用“值传递”,在函数内部改变了参数的值,主调程序的对应变量的值不会改变...在VB中ByRef表示引用传递,ByVal为值传递,VB默认采用引用传递,C ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,414
精华内容 5,365
关键字:

byref