八、指针和内存分配
GO有指针,但没有指针运算,通过类型作为前缀来定义一个指针‘*’:var p *int,现在p就是一个指向整数值的指针。
所有新定义的变量被赋值为零值,而指针为nil,相当于其他语言的null
让指针指向某些内容,可以使用取址操作符(&)
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 var p *int //p是整型指针变量 9 fmt.Println(p) 10 var i int 11 p = &i //使得p指向i,把地址赋给p(i=*p) 12 fmt.Println(p) 13 *p = 8 //修改i的值 14 fmt.Println(i, *p) 15 }
结果:
<nil>
0x10dd0028
88
内存分配
两个内存分配原语,new和make
new返回指针 new(T) 返回*T指向一个零值T
make(T,args) 只能创建slice,map和channel 并且返回一个有初始值(非零)的T类型而不是*T。
make([]int,10,100) 分配了100个整数的数组,长度10和容量100 ,
区别是new([]int)返回指向新分配的内存指针,而零值填充的slice结构是指向nil的slice值
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 var p *[]int = new([]int) //分配slice结构内存;*p==nil 9 var v []int = make([]int, 10) 10 fmt.Println(&p) 11 fmt.Println(v) 12 }
结果:
0x10dd0038
[0 0 0 0 0 0 0 0 0 0]
浙公网安备 33010602011771号