1、定义
指针也是一个变量,但它是一个特殊的变量,它存储的是另一个变量的内存地址。是引用数据类型。
取一个变量的地址:&a
定义: var p *int = &a
可以理解为 指针变量p中存储的是a的内存地址,但是变量p也有自己的内存地址。
func main() {//golang中所有的变量都对应一个内存地址a := 10var p = &afmt.Printf("p的值是%v,p的类型是%T,p的地址是%p", p, p, &p)
}
2、指针取值
*p 表示的是 取出p这个变量对应的内存地址的值。
&p 变身指针变量的内存地址。
func main() {//golang中所有的变量都对应一个内存地址a := 10var p = &a // 指针变量fmt.Println(p) // 打印的是a的内存地址 0xc00000a0a8fmt.Println(*p) //打印的是a的值 10*p = 30 //改变 p 这个变量对应的内存的值fmt.Println(a)
}
3、new和make函数分配内存空间
在 Go 语言中 对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间 。
Go 语言中 new 和 make 是内建的两个函数,主要用来分配内存。
new函数分配内存空间
func main() {//new 关键词来声明一个指针, new分配内存var b *intb = new(int)*b = 10fmt.Println(b, *b, &b)
}
make函数分配内存空间
make函数也可以分配内存空间,但是和new不同的,make只于slice、map以及channel。
func main() {userInfo := make(map[string]string)userInfo["name"] = "张三"a := make([]int, 4, 4)a[0] = 1fmt.Println(userInfo, a)
}
new函数和make函数的区别
1、两个都是做内存分配。
2、make只用于slice、map以及channel的初始化,返回的还是这三个引用类型的本身。
3、new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。