Golang数据类型之指针
2021/8/3 23:37:21
本文主要是介绍Golang数据类型之指针,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- 1、概述
- 2、声明
- 3、空指针
- 4、用指针修改值
- 5、指针的指针
1、概述
每个变量在内存中都有对应的存储位置,也就是内存地址
指针类型是指变量存储的是一个内存地址的变量类型,在golang
中可以通过&
运算符获取变量的指针
取变量指针的语法
ptr := &v // v的类型为T // v:代表被取地址的变量,类型为T // ptr:用于接收地址的变量,ptr的类型就为*T,称做T的指针类型。*代表指针
2、声明
指针声明需要指定存储地址中对应数据的类型,并使用*
作为类型前缀进行指针取值
func main() { //指针取值 a := 10 b := &a // 取变量a的地址,将指针保存到b中 fmt.Printf("type of b:%T\n", b) c := *b // 指针取值(根据指针去内存取值) fmt.Printf("type of c:%T\n", c) fmt.Printf("value of c:%v\n", c) } /* type of b:*int type of c:int value of c:10 /*
用法归纳
- 对变量进行取地址
(&)
操作,可以获得这个变量的指针变量 - 对指针变量进行取值
(*)
操作,可以获得指针变量指向的原变量的值 - 指针变量的值是变量的内存地址
3、空指针
指针变量声明后会被初始化为nil
,表示的是空指针
func main() { var p *string fmt.Println(p) fmt.Printf("p的值是%v\n", p) if p != nil { fmt.Println("非空") } else { fmt.Println("空值") } }
还可以使用new
函数进行初始化,new
函数会根据数据类型申请内存空间并使用零值填充,并返回申请的空间地址
var a *int = new(int) fmt.Println(&a) fmt.Println(a) // 0xc000014330 fmt.Println(*a) // 0 // 变量的地址 指针的地址 指针的值
4、用指针修改值
exchange
函数依次进行的操作:
-
取
c
指针的值, 赋给临时变量t
-
取
d
指针的值, 赋给c
指针指向的变量 -
将
c
指针的值赋给d
指针指向的变量
func exchange(c, d *int) { t := *c *c = *d *d = t } func main() { a, b := 6, 8 // 准备两个变量, 赋值6和8 exchange(&a, &b) // 交换变量值 fmt.Println(a, b) // 输出变量值 } /* 8 6 */
5、指针的指针
用来存储指针变量地址的变量叫做指针的指针
func main() { var a int var ptr *int var pptr **int a = 3000 /* 指针 ptr 地址 */ ptr = &a /* 指向指针 ptr 地址 */ pptr = &ptr /* 获取 pptr 的值 */ fmt.Printf("变量 a = %d\n", a ) fmt.Printf("指针变量 *ptr = %d\n", *ptr ) fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr) } /* 变量 a = 3000 指针变量 *ptr = 3000 指向指针的指针变量 **pptr = 3000 /*
多维指针
func main() { var a ****int v := 10 p1 := &v // *int p2 := &p1 // **int p3 := &p2 // ***int a = &p3 // ****int fmt.Println(v, p1, p2, p3, a, ****a) // 10 0xc000114168 0xc00011e028 0xc00011e030 0xc00011e038 10 }
See you ~
这篇关于Golang数据类型之指针的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26go.mod的文件内容是什么?-icode9专业技术文章分享
- 2024-11-23MongoDB身份认证机制揭秘!
- 2024-11-20MongoDB教程:从入门到实践详解
- 2024-11-17执行 Google Ads API 查询后返回的是空数组什么原因?-icode9专业技术文章分享
- 2024-11-17google广告数据不同经理账户下的凭证可以获取对方的api数据吗?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么实现同时向多个邮箱发送邮件?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么设置header 和 标签tag 呢?-icode9专业技术文章分享
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼