依稀记得大学必修课,C语言中的指针,简直是噩梦,指来指去,有没有晕乎乎的感觉,我在想是不是也因为如此,所以Java语言的开发者才比C语言的多,Java正因为解决了C的痛点,所以今天才能今天在语言排行榜占其首,Go作为后起之秀,又引入这么复杂难懂的概念,可见 指针我们还是需要学习的,下面我们一起体验一下go的指针吧
我的理解
指针(Point),一个变量指向内存中存储某个值的地址,那么这个变量是一个指针变量,个人是如此理解也就是说指针指的是地址,不是值
百度百科
指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
在go中指针有两个概念
我们看下面一段代码
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) } //输出结果 0xc00005a2d0 1 // 思考一下这行代码输出什么 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
从上面的代码中可以看出指针传递后,对指针所指向地址的值修改后,对其它方法是可见的
关于go的指针就分享到这里了,希望能帮到大家。
本文分享自微信公众号 - GoLang那点事(aweiaichitudou)
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2019-07-06
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句