博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
彻底学会Go指针--就要学习Go语言
阅读量:2289 次
发布时间:2019-05-09

本文共 2248 字,大约阅读时间需要 7 分钟。

原创文章,若需转载请注明出处!

欢迎扫码关注公众号「Golang来了」或者移步 ,查看更多精彩文章。

什么是指针

写代码的时候,我们通过变量就可以操作存储在内存中的值,进行赋值、加减运算等。大家有没有想过,变量代表什么呢?其实,一个变量对应一段内存空间,这段空间就存储了该变量相对应类型的值。指针的值就对应变量的地址,只通过指针,就可以更新或者读取变量的值,而不需要用到变量名。

var i int = 10      //声明变量i,并初始化为10var ptr *int = &i fmt.Println(ptr,*ptr)// 0xc000018060 10  指针变量ptr存储的是i地址,*ptr对应指针指向的变量的值*ptr = 12  				// i=12  更新指针指向的变量的值fmt.Println(*ptr,i)		// 12 12

上面这段代码,声明了*int 类型的指针变量 ptr ,通过取址运算符&获得指向整型变量 i 的地址。可以说,指针ptr指向变量i,或者说ptr指针保存了变量i的地址。

指针声明

通过上面一段话的解释,相信大家对指针有了比较清晰的认识:指针指向一个变量的内存地址。要想使用指针,必须先声明,格式如下:

var var_name *var_type// var_name 指针名称,var_type 指针所指向的变量的类型
var i int = 10str := "go"var ip *int         // *int类型的指针var pstr *string    // *string类型的指针ip = &ipstr = &strfmt.Println(*ip,*pstr)     // 10 go

注意*int类型的指针,说明该指针指向的一定是int类型的变量,*string类型也类似。

str := "go"var ip *intip = &str  // 编译不会通过

*int 类型的指针,指向的变量若是string类型的,编译器编译的时候就会报错:

cannot use &str (type *string) as type *int in assignment

如何使用指针

文章写到这里,关于如何使用指针,其实上文已经列出来了,主要经过三个步骤:声明赋值访问指针指向的变量的值

x,y := 1,"go"var px *int = &x    	// 1、声明并初始化var py = &y				// 2、省略指针类型,编译器自动判断//px,py := &x,&y		// 3、使用 :=fmt.Println(*px,*py) 	// 1 go   访问

关于空指针

一个指针已声明而没有赋值时,称为空指针,为 nil 。任何类型的指针的零值都是 nil

var ip *intfmt.Println(ip)							// nilfmt.Printf("ip 的值为:%x", ip)			// ip 的值为:0

如果ip != nil 为真,那么p是指向某个有效变量。指针之间也是可以进行相等测试的,只有当它们指向同一个变量或全部是nil时才相等。

1、指向同一个变量 truex,_ := 1,1px,py := &x,&xfmt.Println(px == py)  2、指向不同变量 falsex,y := 1,1px,py := &x,&yfmt.Println(px == py)3、两个nil指针 truevar px *intvar py *intfmt.Println(px == py)

指针作为函数参数使用

指针包含的是一个变量的地址,如果将一个指针作为参数传递给函数,就可以通过指针来更新变量的值。

func a(p *int){
*p++}i := 10fmt.Println(i) // 10a(&i);fmt.Println(i) // 11

不常用的new函数

给大家介绍下new函数,内建的new函数也是一种创建变量的方法,new(type)表示创建一个type类型的匿名变量,并初始化为type类型的零值,返回变量的地址,指针类型为*type

p := new(int)   	// p, *int 类型, 指向匿名的 int 变量fmt.Println(*p) 	// 0*p = 2          	// 设置 int 匿名变量的值为 2fmt.Println(*p) 	// 2

new函数创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外。

下面的两个函数有着相同的行为:创建变量,并返回变量地址

func newA() *int {
return new(int)}func newB() *int {
var i int return &i}

每次调用new函数都会返回新的变量的地址:

p := new(int)q := new(int)fmt.Println(p,q)   // 0xc000018060 0xc000018068

new函数使用的比较少,不过觉得挺有意思的,就在这给大家分享下!实际编程,多的还是使用具体类型创建变量,毕竟更方便,是吧!

(全文完)

扫描上方二维码,欢迎关注公众号「Golang来了」,获取最新精彩文章!

你可能感兴趣的文章
蚂蚁上市延期!还想进阿里做技术专家?这套java面试题送给你
查看>>
终于学完了2021年阿里内部480道全套java面试题及答案
查看>>
面试官:熟悉Redis吗,项目中你是如何对Redis内存进行优化的
查看>>
JVM 实战学习总结:JVM 的分代模型:年轻代、老年代、永久代
查看>>
面试官:聊聊 Spring 中的线程安全性
查看>>
一篇文教你在 Java 中利用 redis 实现分布式全局唯一标识服务
查看>>
深入浅出数据库事务和4种隔离级别
查看>>
对限频限流的思考
查看>>
15天内4面阿里,成功拿下offer,分享个人面经
查看>>
万字长文,带你深入浅出五种负载均衡策略。
查看>>
看图搞懂微服务架构
查看>>
详解:java工具之解析yaml文件
查看>>
包教包会:搭建RocketMQ双主双从同步集群,
查看>>
5年Java程序员,五面蚂蚁险拿offer定级P7,大厂面试不过如此?
查看>>
大厂面试必问!HashMap 怎样解决hash冲突?
查看>>
面试屡屡碰壁,痛定思痛闭关修炼!半年后4面阿里成功拿offer
查看>>
最全的大厂最新面试249题与笔记总结:多线程+JVM +Spring+微服务+分布式+Redis+MySQL
查看>>
吊!设计模式全解:6大设计原则+23种设计模式+设计模式PK+设计模式混编
查看>>
服!看完阿里大牛手写的Java异步编程实战笔记,我惊呆了
查看>>
Java程序员跳槽,三面之后被拒,原因竟是“招不起”
查看>>