不知不觉已经工作一周了,面对java转go第一件不适应的事,就是指针它lei了,因为java把指针给隐藏了,我学习java的时候并没有太在意指针的问题,但是在看go文档时赫然发现指针它又回来了。
问题1 那么指针它到底是个什么?
我们首先得明确这一点,先问个其他问题
var num int = 6;//这行代码表示什么
肯定有聪明小伙伴会说:这是定义了一个整型的数并给它赋值为6嘛。
恭喜你答对了
从计算机角度来说你是在内存空间中申请了一块地方,在将6放了进去
那么问题来了
var ptr *int
这个代码又代表什么呢?
其实*int和int写的位置都是一样的,也就是代表说他们的代表的都是类型,int代表整形,而*int代表整形的指针。
这时,你就应该明白了指针是一种类型。
那么指针是干什么用的呢?
回想一下,在日常生活中我们都去过超市买东西,买东西的时候要把包放到柜子里,每次存柜子的时候机器是不是会给你一个纸质的条形码?条形码上面是不是写着柜子是XXX号?我们现在把电脑的内存就想像成这些柜子,我们平时写的数据就像你的包一样。而指针就是我们手中的那张纸质的条形码。我们通过这个条形码来找到那个柜子取出或者放入我们的包。从计算机的角度来说,他根据指针来找到内存地址来存入数据。
问题2 指针怎么使用?
上面我们大概知道指针是个什么东西了,那么它该如何使用呢?我们在拿上面的那个代码举例子
var num int = 6;//没错,又是我
我们为什么要定义这个数,是不是为了将这个6存到这个变量num里方便我们以后去使用它?
var ptr *int//现在我们又定义了一个整型的指针
现在我们定义了一个整形的指针也是为了将一个数的地址保存下来存入这个变量prt里
var ptr *int = &num
到了这行代码很多人又开始迷惑了,这是啥啊。首先我们需要知道&这个符号的作用,它是取出一个变量的地址。
而指针需要存的就是一个地址,所以我们借助&这个运算符将num的地址取出并存到prt这个变量当中。
好了,这时候我们可以说ptr这个针指向了num这个变量
这时我们输出一下这些值
package main
import "fmt"
func main() {
var num int = 6
var ptr *int = &num
fmt.Println(&num)
fmt.Println(ptr)
}
结果是
0xc000060080
0xc000060080
具体出现的值每个计算机可能都不一样,但这两个值一定是相同的。
这就说明prt将num的地址记录了
问题3 *这个符号出现的位置不同,作用也不一样你知道吗?
很多同学(包括我)都对被*这个符号经常搞蒙比如说以下几行代码
package main
import "fmt"
func main() {
var num int = 6
var ptr *int = &num
fmt.Println(*ptr)
*ptr = 7
fmt.Println(ptr)
fmt.Println(*ptr)
}
感觉哪都是*,有什么区别吗
其实是有的
我们先输出一下结果
6
0xc000060080
7
我们会发现输出有没有*差别会很大
首先这一行代码var ptr *int = &num
这里的*是告诉计算机它是一个指针变量,*int代表着它是一个指向int型变量的指针
而fmt.Println(*ptr)这里的*是什么作用呢?
记不记得&这个符号?
它是取出一个变量的地址
因为ptr此时存的是num变量的地址
fmt.Println(*ptr)这里的*的作用:通过地址来取值
等等等,等一下,怎么*一会来定义一会来取值啊,它到底什么作用啊?
*的作用其实看它出现在哪里
出现在定义里面它的作用是告诉计算机这是一个指针变量
package main
import "fmt"
func main() {
var num int = 6
var ptr *int = &num
}
而出现在除了定义以外的地方表示通过地址来取出里面的值
package main
import "fmt"
func main() {
var num int = 6
var ptr *int = &num
*ptr = 7 //这里等价于num = 7
}
好了以上就是我在golang里总结的指针一些知识
(第一次写技术博客有什么错误的地方还希望大家多多指正,以后我会经常写一些自己在学习遇到的一些知识点,希望能够互相学习( ̄▽ ̄))