指针
变量是一种使用方便的占位符,用于引用计算机内存地址。Go
语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。另外一个符号是*
,表示的是根据地址取值。Go
语言中指针不能进行偏移和计算,是安全的指针。 指针是引用类型,初始化之后才能够使用。
- &:取地址
- *:根据地址取值
指针地址和指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go
语言中使用&
字符放在变量前面对变量进行“取地址”操作。
Go
语言中的值类型int、float、bool、string、array、struct
都有对应的指针类型,如:*int
、*int64
、*string
等。取变量指针:
1 | func main() { |
如何使用指针
- 定义指针变量
- 为指针变量赋值
- 访问指针变量中指向地址的值
- &和*实际上是一对取反操作:
值------->&---->指针地址------->*----->值
1 | package main |
指针取值
1 | package main |
new和make
-
引用类型的变量,在使用的时候不仅要进行声明,还要分配内存空间。
-
值类型的声明不需要分配内存空间,声明的时候默认分配了内存空间。
-
new和make是内建函数,主要是用来分配内存
new
1 | func new(Type) *Type |
- Type表示类型,new函数只接收一个参数
- *Type表示指针类型,new函数返回一个值指向该类型地址的指针
- new函数返回指针,并且该指针对应的值为该类型的零值
1 | func main(){ |
make
-
用于内存分配
-
只用于
slice
、map
和chanel
的内存创建,常用于初始化 -
返回的类型是三种类型本身,而不是他们的指针类型
1
funmake(t Type, size ...InterType) Type
1 | package main |
new和make区别
- 二者都是用于分配内存的
- make只用于slice、map和chanel的初始化,返回的是引用类型本身
- new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针
指向指针的指针
若一个指针变量
指向的是另一个指针变量的地址
,称这个指针变量为指向指针的指针变量
。一个指针变量------>另一个指针变量的地址
访问指向指针的指针变量需要使用两个**
。
1 | var ptr **int |
栗子
1 | package main |