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]
//①数组名:arr[i] //②指针:(*p)[i] //③指针:p[i] var p *[3]int var arr [3]int=[3]int{1,2,3} p=&arr
//三种方法 arr[2] (*p)[2] p[2]
//错误方式
*(p+1)
*(p++)
3、指向切片的指针
1)说明
切片的本质就是一个指向数组的指针,因此指向切片的指针是一个二级指针
2)定义与操作
var sce []int = []int{1,3,5} //sce的类型是[]int var p *[]int //p的类型是*[]int p=&sce //p指向切片时也是用引用& p //&[1,3,5] *p //[1,3,5]
访问其中某个值
①sce[i]
②(*p)[i]
4、指向字典的指针
dict :=map[string]string{"name":"lnj","age":"33"} var p *map[string]string=&dict //通过指针操作map元素 (*p)["name"]="zs"
5、指针作为函数参数和返回值
指针作为参数时,此时函数内外是引用传递——对形参的修改会影响实参。
不能将函数内部定义的指向局部变量的指针进行返回,这样在函数结束时空间会被释放。
可以将局部变量作为返回值,本质是拷贝一份。