首页
学习
活动
专区
圈层
工具
发布

Go语言的指针 & *

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。...Go语言的指针,基本上只剩下用于区分 byref 和 byval 语义。 运算符就是简单的 & 和 * 一个取地址、一个解析地址。 ?...1:1 2:0 3:2 4:2 传值与传指针 当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy,当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化,因为数值变化只作用在...传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。...(注:若函数需改变slice的长度,则仍需要取地址传递指针) 要访问指针 p 指向的结构体中某个元素 x,不需要显式地使用 * 运算,可以直接 p.x ; ?

69150
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    过程(四)传地址和传值

    上节介绍了过程的传递参数部分内容,即实参与形参的结合。 在VBA中实参可以通过两种方式将数据传递给形参,分别为传地址和传值,都是在创建通用过程定义变量时。...一、 传 地 址 传地址是VBA默认的数据传递方式,在定义过程时,如果形参前面有关键字ByRef或者省略,则该参数通过传地址的方式传递。...这是因为在调用过程时,将变量b做实参按地址传递给变量a,变量b和变量a指向同一个内存单元,一起变化。...定义过程中,在形参面前添加ByVal关键字,则该参数就按传值方式传递。 将上面示例中传地址的方式改成传值方式再运行一次,对比下结果。...而传值则相反 在实际中,可以先用传值方式,等调试后,再改为传址方式 3,用传址方式,要求实参与形参的数据类型完全一致 ---- 本节主要介绍过程的参数传递问题,重点是区分传地址和传值两种方式,结合示例去理解

    5.4K30

    一起学Excel专业开发26:使用类模块创建对象5

    在类模块中引发事件分两步: 1.在类模块中声明事件 2.使用RaiseEvent引发该事件 下面是修改后的CCells类模块中的代码: '创建枚举常量 Public Enum anlCellType...类和CCell类之间显示地建立了父子关系现在,所以枚举型常量anlCellType的声明在父类集合的类模块CCells中。...在CCells类中,声明了一个名为ChangeColor的事件,包含两个参数:第一个参数uCellType接受需要进行更改的单元格类型,第二个参数bColorOn指定是否进行颜色转换。...对BeforeDoubleClick事件和BeforeRightClick事件进行了修改,使之能够引发新的事件,并传递给ChangeColor事件目标单元格的类型和指定颜色开或关的布尔值。...使用《一起学Excel专业开发25:使用类模块创建对象4》中介绍的方法,在CCell类模块中捕获Cells对象所引发的事件。

    76530

    Function函数

    这种将复杂功能分解成若干小功能,由各个小功能来组合完成一个复杂功能的编程思想是非常重要的: 可以简化开发难度 提高代码的复用 2、Function的参数 VBA中,参数的传递有2种方式: Byval...Byref 传地址,传递的是变量的地址,就是原始变量。 打个比方: 孙悟空和妖怪打架,他法术好,用个毫毛就能变个分身,他让分身去打架,妖怪伤害了分身,不会影响他自己。这就是Byval。...如果参数前面省略了修饰符,默认是Byref(个人认为这个默认非常的不好,我刚开始用VBA的时候碰过这个问题,莫名其妙不知道为什么变量的值不对了)。...这2种方式的区别初学者只要记住(非常重要)就可以,要理解有点难度,需要一定的计算机内存方面的知识。 只要简单记住,如果你传递的变量只是给其他函数使用的,并不需要改变的话,用Byval。...如果其他的Sub过程也需要这个功能,直接调用即可,这也就是代码的复用了。 4、小结 介绍了Function的规则、参数的传递、Function的作用等。

    1.2K30

    一起学Excel专业开发06:Excel应用程序开发的一些好的做法

    在进行Excel应用程序开发时,如果遵循一些好的做法,将会极大地增强程序的可读性、可理解性、可维护性和复用性。 代码注释 良好的代码注释是Excel应用程序开发中非常重要的原则之一。...位于模块的开始部分,简要描述模块中代码的目的。 2.过程级注释。通常放置于每个过程名上方或者过程的第一行语句上方,说明过程的目的、注意事项、参数的意义和作用、函数返回值说明、过程修改的时间和内容等。...2.在同一代码段中,对齐的代码行之间往往是并列关系,而缩进则用于表明代码行之间的逻辑结构关系。 3.合理使用代码连接符(即英文的下划线_),可以在多行中显示较长的语句。...2.如果想隐藏模块中的过程,使用户接口或其他Excel工程不能使用模块中的过程,则可以在模块顶部使用Option Private Module语句声明。...2.在声明过程参数时,显式使用ByRef或ByVal。 3.在使用前验证过程参数的有效性。 4.显示调用对象的默认属性。 5.经常使用菜单“调试-编译”命令。

    84030

    VBA Object对象的函数参数传递

    VBA的函数参数传递方式是Byval和Byref,数值类型、Stirng等那些值类型的是要非常注意用哪种方式的。对于Object对象引用类型的一直都说2种方式完全没有区别。...Object对象的Byval和Byref参数真的没有区别吗? 对于操作的这个Object对象来说,可以认为是没有区别,但是传递过程和其他数据类型的参数传递是一样的,遵守的规则并没有改变。...ByVal 参数传递的时候,会在内存中另外复制一份,函数操作这个副本和传递之前的那个变量已经没有了任何关系; Byref 会把参数的内存地址传递给函数,函数接收到这个是通过内存地址来读取或者改写的,操作的就是原来的变量...可以理解为参数其实就是一个LongPtr类型,所以你是复制一份这个LongPtr类型的数字传递,还是把这个LongPtr类型所在的内存地址传递给函数,对于Object这个对象来说,是没有区别的。...(rng) = x022edd0, ObjPtr(rng) = 0xfaaddd0, VarPtr中保存的数据 = 0xfaaddd0 从打印输出可以看出,Byval传递需要复制参数,其实只是把保存对象地址的那个内存地址

    3.8K20

    VB语言使用ADO连接、操作SQLServer数据库教程

    ydl890406大大,在VB群中写这东西时,让我借用了,后来我发现有很多错误,y大神修改几次后的还是有错误,干脆重写了一遍,这就是后来的代码。...第二部分是AOD的代码连接,由于第二部分涉及到Recordset对象和Connection对象,自己学一下,完全可以自己编写。...何为Recordset对象和Connection对象,Connection对象是与数据源的连接,Recordset对象是操作数据。...,计数器复位Public Sub DBapi_Disconnect()  Connect_Num = 0  DisconnectEnd Sub '执行数据库操作语言'byval 就是按参数的值传递,再传递过程中...,参数不会发生变化(也就是将参数值而不是将地址传递给过程的方式,这就使过程访问发哦变量的副本,过程不可改变变量的值);与之对应的是byref,指按参数的地址传值,byref可以省略Public Sub

    3.8K10

    Vb.netVB 声明API功能父窗口功能

    事实上细致看两者并没有多大的差别,先看看在vb.net中怎样调用: 首先加入一个类模块。...函数声明的差别: 1、当中最基本的一个差别就是在vb中定义的数据类型是long。...而在vb.net中则使用Integer来代替long,由于在vb.net中Integer类型是32位的,和long类型一样。...2、要注意使用ByVal和ByRef ByVal是传递值,源数据不会被改动,能够把这个值当做自己的局部变量来使用;(传递參数内存给被调用者) ByRef是传递地址,源数据可能被改动。...(传递參数地址给被调用者) 3、在主窗口调用API函数的时候要注意“Handel.ToInt32”的使用,他等同于vb调用过程中的.hwnd H:handle;Wnd:变量对象描写叙述,也就所谓窗口。

    88440

    VB.NET自我总结语法

    Next  For Each item In List            //exit for  Next 五、过程和函数 Public Sub 函数名称(ByVal/ByRef  参数名  As... Integer) as 类型 End Sub Public Function 函数名称(ByVal/ByRef  参数名  As Integer) as 类型   'vb6.0 带返回值的函数写法  ...Dim str2 As String = "222"  Return str2 End Function 六、vb.net 中的模块(Module),一般用途一般只用来定义全局变量和公用方法。...所以模块有点虚的概念 模块可以被组织到命名空间中去,因为模块其实是个虚的,所以它的方法也可以直接外层的命名空间调用。      七、多个相同事件,同用同一个事件。...比如你的一个对象有一个事件A,在执行的过程中,这个对象RaiseEvent   A,那么调用者的handles   对象.A   的SUB就会被执行。

    78610

    VBA使用API_01:读取文件

    现在想想其实应该先了解一些数据类型、参数传递、内存方面的东西,再来用API的时候,就会顺利许多。...API的复杂之处我认为就是参数多样,而且传递的时候非常要注意是传值还是传地址。...2、参数传递 值参数 很多参数API中只是使用,所以VBA里传递是按值传递还是按照地址传递其实都是一样的,这个和VBA里的Function是一样的。...另外有很多复杂的参数,一般都不大常用,这种在VBA里我们直接声明为Byval后传递0就可以,像CreateFile里的dwFlagsAndAttributes和hTemplateFile我们都可以设置为...指针参数 这是一种非常容易出错的参数,比如ReadFile中有个参数lpNumberOfBytesRead,这种参数是一种指针,API函数会在内部操作这个指针,所以如果这个参数一旦传递错误,比如按Byval

    1.8K10

    VBA函数与过程简洁教程

    'VBA函数与过程简洁教程 Sub 过程名() 'Sub表示过程,在执行宏或图形右击指定宏中看得到,不能返回值 Call 函数名(Array(1, 2), b) '调用过程并把返回值放入r End Sub...'结束过程 Function 函数名(a, Optional ByVal b) 'Function表示函数,在单元格中也可以使用,宏列表看不到,可以使宏列表简洁 'VBA默认ByRef会改变原参数的值...,所以加了ByVal If IsMissing(b) Then b = 1 'Optional表示参数可以选择性省略,上面的语句是如果没有时设定值,常用设定可选来灵活调试,如果有一个非可选就不能直接运行...定义可变数组,UBound()是求最大下标值 arr(1) = b 函数名 = arr '返回值,仅Function可用 Exit Function '退出函数,不要用return,return是在一个程序中回到

    1K30

    一起学Excel专业开发23:使用类模块创建对象2

    集合对象是VBA提供的内置对象,可用来保存对象和数据。集合对象对于存放在其中的数据的类型没有任何限制,不同类型的数据也可以存放在同一个集合对象中。...= gcolCells(“$A$3”) ‘访问集合中关键字为$A$3的元素 我们可以控制添加到集合中的对象的类型,也可以在集合中添加一些新方法,例如,使用一个方法来高亮显示相同类型的单元格,再用另一个方法来取消这些高亮显示...由于集合对象对于外部是不可见的,因此编写自已的Add方法,并且还创建Count和Item属性过程用于表示集合中的对应属性。...Highlight方法通过循环语句遍历集合中的每个成员,如果CCell对象的CellType属性和参数uCellType指定的类型值相同,则执行CCell对象的Highlight方法。...同理,UnHighlight方法通过循环语句遍历集合中的每个成员,如果CCell对象的CellType属性和参数uCellType指定的类型值相同,则执行CCell对象的UnHighlight方法。

    1.3K20

    VBA专题10-21:使用VBA操控Excel界面之禁用和启用控件、组和选项卡

    被禁用的控件在功能区中显示的是灰色。...在ThisWorkbook模块中的SheetActivate事件处理代码: Private Sub Workbook_SheetActivate(ByVal Sh As Object) '在Excel...在Custom UI Editor中保存该文件,首次在Excel中打开该文件时,将会出现关于Initialize和GetEnabledAttnSh过程提示的错误消息,因为在标准的VBA模块中仍然没有这两个回调过程...End Sub 要基于其在XML代码中的id禁用(和启用)某自定义控件,在现有的标准VBA模块或者新的标准VBA模块中包括下面的代码: Sub EnableAll() Call RefreshRibbon...是否启用(或禁用)某控件取决于在RefreshRibbon中参数传递的值。一旦使这些控件无效,就调用GetEnabledAttnSh过程,遍历共享这个相同回调的所有无效的控件。

    3.8K20

    VB.NET语法小结

    Next For Each item In List //exit for Next 五、过程和函数 Public Sub 函数名称(ByVal/ByRef 参数名...As Integer) as 类型 End Sub Public Function 函数名称(ByVal/ByRef 参数名 As Integer) as 类型 'vb6.0 带返回值的函数写法...Dim str2 As String = "222" Return str2 End Function 六、vb.net 中的模块(Module),一般用途一般只用来定义全局变量和公用方法。...所以模块有点虚的概念 模块可以被组织到命名空间中去,因为模块其实是个虚的,所以它的方法也可以直接外层的命名空间调用。 七、多个相同事件,同用同一个事件。...比如你的一个对象有一个事件A,在执行的过程中,这个对象RaiseEvent A,那么调用者的handles 对象.A 的SUB就会被执行。

    1.6K30

    实现用VB.Net(C#)开发K3 BOS 插件的真正可行方法

    、C#)开发的DLL是跑在.net CLR上的中间二进制字节码以及其他一些有自描述功能的元数据组成的,它不符合COM+规范,金蝶K/3及BOS都是用VB6开发而来的,EAS那就另当别论了,所以BOS插件说白了也是...VB6调用符合COM规范的DLL,它的原理就是在原程序里(宿主)先导入放在BOS插件上的dll然后直接Byref调用Public Sub Show(Byval XXX as Object) 来把需要编程的对象传递过来...2、   .NET中的强名strong name 说白了就是为了保护你的组件不被破坏,.Net开发的dll想给像com那样被调用那就必须加个强名(数字签名) ’---------------------...2,进去后在菜单 [项目]>>[添加引用] 处添加 K3ClassEvents.dll 组件(和VB6一样要添加它)如:图2.1                                                        ...图 2.1 3,以net的方式和规范编写代码,具体可参考BOS资料和VB6的工具栏插件生成的代码稍作修改作为骨架码

    1.5K10

    过程(五)可选参数和可变参数

    大家好,上节介绍了过程传递参数时,形参与实参结合的两种方式,传地址和传值。本节将介绍可选参数和可变参数。...在vba过程中,通过在形参前面加上Optional关键字来设置该形参为可选参数,在过程内部通过使用ismissing函数可测试调用程序是否传递了可选参数。...---- 二、可变参数 上面介绍可选参数时,可以发现在定义过程时,不管是固定参数还是可选参数,都已经制定了参数的个数,那么在VBA中还可以定义可变参数,即参数的个数在定义时时未知的。...在调用时,参数传递将参数i的地址传递给sum1子过程的形参t,将后面1,2,3,4,5,6作为一个数组传递给intnum()数组。在子过程中计算数组中所有元素的和。...需要注意的是ParamArray只能用于参数列表的最后一个参数,指明最后这个参数是一个Variant变体型变量元素的Optional数组,ParamArray关键字不能和ByVal、ByRef或Optional

    5.1K20
    领券