1.类型
地址,某个变量对应的值的内存地址。 指针,一种数据类型,用来存储地址的。 通过运算符 & 来获取某个变量对应的值的地址。
代码示例:
func main() {
r := '区'
rp := &r
fmt.Println(rp) // 0xc000096004
}
如图所示:
注意:指针型变量,也是常规变量结构,只不过其值是地址。
2.操作
&,获取地址。
*,解析地址。
指针类型,可以通过地址,来找到对应的值,该操作称之为解析地址, 使用运算符 * 完成。
代码演示:
func main() {
r := 42
rp := &r
fmt.Println(rp) // 0xc000014068
fmt.Println(*rp) // 42
}
- 解析地址可以级联使用,可以出现语法,表示级联解析,如果一个指针类型的变量, 对应的值还是指针类型,可以级联(继续)完成解析。 以此类推,可以出现* 等等
代码演示:
func main() {
v := 42
vp := &v
vpp := &vp
fmt.Println(vpp) // 0xc000092018
fmt.Println(*vpp) //0xc000098008
fmt.Println(**vpp) // 42
}
3.作用
指针的作用是为了可以通过多个变量的方式操作同一个值。
最典型的是函数调用是,让函数内的变量完成对函数外的变量的修改(因为函数会导致变量出现作用域的问题,所以如此),演示如下:
func main() {
v1 := 42
v2 := 42
Plus10(v1, &v2)
fmt.Println("v1:", v1)
fmt.Println("v2:", v2)
}
func Plus10(p1 int, p2 *int) {
p1 = p1 + 10
fmt.Println("p1:", p1)
*p2 = *p2 + 10
fmt.Println("*p2:", *p2)
}
函数参数的传递为值传递,指的是参数间是值复制的关系,上例子中,p1 和 v1 分别对应 不同的 42,因此修改 p1,不影响 v1。
我们通过地址的方案,记录了 v2 的地址,传递给 p2,此时函数内,通过 p2 记录的 v2 的地 址,对 v2 的值进行修改,达到了在函数内修改 v2 的目的!
4.定义指针
T, 定义某种类型的指针类型,指针也是强类型
int 表示为 int 型指针,一个指针变量,内部存储的地址对应的数据类型为 int 型。
float32
可见,变量是强类型,指针也是强类型。
5.零值
nil,空指针,指针类型的零值
当仅仅声明一个变量为指针类型时,值为 nil: