八、指针和内存分配

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

内存分配

两个内存分配原语,newmake

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]

posted on 2013-01-31 23:48  liubiaoren  阅读(134)  评论(0)    收藏  举报