GoLang:指针
学习自:GoLang教程110页
1、普通指针
说明
指针变量用于存放其他变量的地址
无论指向什么类型的变量,指针的实际内存占用都是一样的:32位4B,64位8B:
var p1 *int; var p2 *float64; var p3*bool; fmt.Println(unsafe.Sizeof(p1))//8 fmt.Println(unsafe.Sizeof(p2))//8 fmt.Println(unsafe.Sizeof(p3))//8
使用:*p
var num int = 666 var p *int = &num //查看地址 fmt.Printf("%p\n",&num) //0xc0000180c0 fmt.Printf("%p\n",p) //0xc0000180c0 fmt.Printf("%T\n",p) //*int //修改指向地址的内容 *p=888 fmt.Println(num)//888 fmt.Println(*p)//888
2、指向数组的指针
1)指向数组
在Go中,如果要获取数组的地址,有两种方式:&arr与&arr[0]
arr := [3]int{1,3,5} fmt.Printf("%p\n",&arr) fmt.Printf("%p\n",&arr[0]) //不能直接打印数组名 fmt.Printf("%p\n",arr)//错误
Go中,只有相同数据类型才能赋值,所以要将一个指针指向数组,只能这样写:&数组名
var arr [3]int = [3]int{1,3,5} var p *[3]int //p类型是*[3]int p=&arr //以下两种错误写法,只有相同类型才能赋值 p=arr //arr是[3]int类型 p=&arr[0]//&arr[0]是*int类型
说明
不支持+1 -1 ++ --
2)操作数组的几种方式
①数组名:arr[i]
②指针:(*p)[i]
③指针:p[i]
1 2 3 4 5 6 7 8 9 10 11 | //①数组名:arr[i] //②指针:(*p)[i] //③指针:p[i] var p *[3]int var arr [3]int=[3]int{1,2,3} p=&arr <br> //三种方法 arr[2] (*p)[2] p[2]<br><br> //错误方式<br>*(p+1)<br>*(p++) |
3、指向切片的指针
1)说明
切片的本质就是一个指向数组的指针,因此指向切片的指针是一个二级指针
2)定义与操作
1 2 3 4 5 6 | var sce []int = []int{1,3,5} //sce的类型是[]int var p *[]int //p的类型是*[]int <strong>p=&sce</strong> //p指向切片时也是用引用& p //&[1,3,5] *p //[1,3,5] |
访问其中某个值
①sce[i]
②(*p)[i]
4、指向字典的指针
1 2 3 4 5 | dict := map [string]string{ "name" : "lnj" , "age" : "33" } var p * map [string]string=&dict //通过指针操作map元素 (*p)[ "name" ]= "zs" |
5、指针作为函数参数和返回值
指针作为参数时,此时函数内外是引用传递——对形参的修改会影响实参。
不能将函数内部定义的指向局部变量的指针进行返回,这样在函数结束时空间会被释放。
可以将局部变量作为返回值,本质是拷贝一份。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性