什么是指针
指针是存储一个变量的内存地址的变量。
对于我们来说,指针并没有什么特殊之处,指针也是变量(指针变量)。
例如:
//类型为整型指针
var p *int
p指针只能保存int变量的内存地址。
指针的零值,不是0,而是nil。任何未初始化的指针值都为nil。
初始化指针
初始化一个指针,只需给他赋予其他变量的内存地址接口。变量的地址可以使用使用&运算符获得。
var x = 100
var p *int = &x
上面我们通过对x做&运算符来获取其地址,然后将该地址分配给指针p。就像Golang中的其他变量一样,编译器也会推断指针变量的类型。所以你可以在上面的例子中省略指针p中的类型声明,直接简写为:
var p = &x
指针解引用
要获得指针指向地址的值,我们可以使用*运算符。这叫解引用。
package main
import "fmt"
func main() {
var a = 100
var p = &a
fmt.Println("a=",a)
fmt.Println("p=",p)
fmt.Println("*p=",*p)
}
输出结果:
a= 100
p= 0xc000062080
*p= 100
多重指针
指针可以指向任何类型的变量。所以也可以指向另一个指针。以下示例显示如何创建指向另一个指针的指针:
package main
import "fmt"
func main() {
var a = 3.141592
var p = &a //p被赋值了a的地址,p被定义成指针类型
var pp = &p //这里pp保存的是p的内存地址
fmt.Println("a=",a)
fmt.Println("*a=",&a)
fmt.Println("p=",p)
fmt.Println("*p=",&p)
fmt.Println("pp=",pp)
fmt.Println("*pp=",*pp)
fmt.Println("**pp=",**pp) //多重指针要用多个*来解引用
}
输出结果:
a= 3.141592
*a= 0xc000062080
p= 0xc000062080 //这里p的值保存的是a的地址
*p= 0xc00008e018 //这里*p取的就是p自己的地址
pp= 0xc00008e018 //pp的值就是p的地址
*pp= 0xc000062080 //*pp解引用p就取了p的值,p的值就是a的地址
**pp= 3.141592 //这里就取到了a的值