前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go指针,如此轻松掌握

Go指针,如此轻松掌握

作者头像
阿伟
发布2019-07-08 14:48:03
4770
发布2019-07-08 14:48:03
举报
文章被收录于专栏:GoLang那点事GoLang那点事

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

我的理解

指针(Point),一个变量指向内存中存储某个值的地址,那么这个变量是一个指针变量,个人是如此理解也就是说指针指的是地址,不是值

百度百科

指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

在go中指针有两个概念

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

我们看下面一段代码

代码语言:javascript
复制
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语言中通过 & 获取变量地址,通过 * 来获取地址存储的值

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

值传递和指针传递

go语言函数调用时有两种传递方式

  • 一种是值传递
代码语言:javascript
复制
//值传递
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

  • 一种是指针传递
代码语言:javascript
复制
//指针传递
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

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

关于go的指针就分享到这里了,希望能帮到大家。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang那点事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档