Golang 指针学习

什么是指针

指针是存储一个变量的内存地址的变量。

对于我们来说,指针并没有什么特殊之处,指针也是变量(指针变量)

例如:

//类型为整型指针
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的值