专栏首页GoLang那点事Go指针,如此轻松掌握,希望有收获

Go指针,如此轻松掌握,希望有收获

开篇语

依稀记得大学必修课,C语言中的指针,简直是噩梦,指来指去,有没有晕乎乎的感觉,我在想是不是也因为如此,所以Java语言的开发者C才比C语言的多,Java正因为解决了C的痛点,所以今天才能变成语言排行榜占其首,Go作为后起之秀,又引入这么复杂难懂的概念,可见指针我们还是需要学习的,下面我们一起体验一下go的指针吧

指针的理解

  • 我的理解指针(Point),一个变量指向内存中存储某个值的地址,那么这个变量是一个指针变量,个人是如此理解的,也就是说指针指的是地址,而不是值
  • 百度百科的定义,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

Go的指针

在Go中指针有两个概念,一个指针变量是可以指向任何一个值的内存地址,指针变量也是占用存储空间的,在32位系统中占用4个字节,在64位系统中占用8个字节,与这个地址存储的值的大小没有关系指针类型指针类型和指针变量一块出现,指的是这个指针变量的类型是什么,比如我们声明了一个 tempint=1,那么temp变量的这个类型是 int,同时指针变量也是有指针类型的,用 *T表示,T是type的意思,代表具体的类型,比如 pointTemp*int =&temp, 代表 pointTemp这个变量是指针变量,类型是 *int我们看下面一段代码

func PointStudy()  {   
    // 每一个变量在运行时都有一个地址(这个地址存储着这个变量对应的值)  
    var temp int = 1   
    //  go语言的取地址符, temp 变量,通过&符号来获取temp这个变量在内存中的地址,我们将获取到的地址赋值给一个指针变量 pointTemp ,类型*int   
    var pointTemp *int= &temp
   fmt.Println(temp)   
   fmt.Println(pointTemp)
}
//输出结果
1
0xc00005a2d0

指针变量也是变量,变量、指针和地址三者的关系是:每一个变量都有自己地址,每一个指针的值就是地址(也就是这个指针通过fmt.Println输出后一个地址)

如何获取指针对应的地址的值,go语言中通过 &符号 获取变量地址,通过 * 来获取地址存储的值

func PointStudy()  {   
// 每一个变量在运行时都有一个地址(这个地址存储着这个变量对应的值)   
var temp int = 1   
// go语言获取地址符, temp 变量,通过&符号来获取temp这个变量在内存中的地址,我们将获取到的地址赋值给一个指针变量 pointTemp ,类型为 *int   
var pointTemp *int =temp   
fmt.Println(pointTemp)   
fmt.Println(*pointTemp)}
//输出结果0xc00005a2d01
// 思考一下这行代码输出什么
fmt.Println(*&temp)

值传递和指针传递

值传递和指针传递go语言函数调用时有两种传递方式一种是值传递

  • 一种是值传递,看如下代码
func ValueTransmit(){  
    temp := 1   
    fmt.Println(";value transmit before:",temp)  
    method1(temp)   
    fmt.Println("value transmit after:",temp)
}
func method1(temp int)  {  
    fmt.Println("method before:",temp)  
    temp = 2   
    fmt.Println("method after;",temp)
}
//结果
value transmit before: 1
method1 before: 1
method1 after 2
value transmit after: 1
//从上边代码可以看出值传递是一种copy的方式,temp从ValueTransmit传递到method1(),是把temp重新copy了一份,methd1中修改temp是不会影响ValueTransmit中的temp
  • 一种是指针传递,看如下代码:
func PointTransmit(){   
    var temp = 1  
    fmt.Println("point transmit before:",temp)   
    method2(&temp)  
    fmt.Println("point transmit after",temp)
}
func method2(temp *int)  {  
    fmt.Println("method2 before:",*temp)  
    *temp = 2  
    fmt.Println("method2 after:",*temp)
}
//结果
point transmit before: 1
method2 before: 1
method2 after 2
point transmit after: 2

//从上面的代码中可以看出指针传递后, 对指针所指向地址的值修改后,对其它方法是可见的

本文分享自微信公众号 - GoLang那点事(aweiaichitudou),作者:那小子阿伟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go指针,如此轻松掌握

    依稀记得大学必修课,C语言中的指针,简直是噩梦,指来指去,有没有晕乎乎的感觉,我在想是不是也因为如此,所以Java语言的开发者才比C语言的多,Ja...

    阿伟
  • 链表-快速寻找链表中的下一个更大节点?你怎么做

    阿伟
  • Go中锁的那些姿势,估计你不知道

    用俗语来说,锁意味着一种保护,对资源的一种保护,在程序员眼中,这个资源可以是一个变量,一个代码片段,一条记录,一张数据库表等等。

    阿伟
  • Go指针,如此轻松掌握

    依稀记得大学必修课,C语言中的指针,简直是噩梦,指来指去,有没有晕乎乎的感觉,我在想是不是也因为如此,所以Java语言的开发者才比C语言的多,Ja...

    阿伟
  • 数据结构和二级指针

    链表的结构体中,存在一个指向自身的指针。而当结构体中存在两个指向自身的指针时,链表变成了二叉树

    sofu456
  • C语言指针指向你的时候,菜鸡原型毕露!

    所以先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样。

    诸葛青云
  • java Swing GUI 入门-简易加法器

    DrawSky
  • 安恒信息研究员发现Struts 2高危漏洞,Apache官方致谢

    ApacheStruts 2是世界上最流行的Java Web服务器框架之一。不久之前,安恒信息风暴中心安全研究员在Struts 2上发现了一枚远程代码执行漏洞,...

    安恒信息
  • C语言中的函数为什么只能有一个返回值输出?怎么实现多个值输出?

    这是典型的C语言中函数模块中的返回值问题,算是常见的语法细节,很多人觉得C语言已经过时了,只能代表着这类人还不算是真正的技术人员,在嵌入式领域C语言依然充当着非...

    程序员互动联盟
  • iOS网络--HTTP请求HTTP请求

    行走少年郎

扫码关注云+社区

领取腾讯云代金券