指针:
var a *int // 指针,零值为 nil
var b *int = nil // 空指针
// var c *int // 野指针,直接赋值,没有指向,报错
// *c = 222 // invalid memory address or nil pointer dereference
var d *int
d = new(int) // 创建整型大小的空间,gc垃圾回收机制,自动释放空间
*d = 2
e := new(int) // 自动推导类型
*e = 2
p := 1
a = &p
*a = 111
// a = 222 // 不行
// f := new([3]*int) // &[<nil> <nil> <nil>]
// f := new([3]*int) // &[0 0 0]
g := [3]int{1, 2, 3}
var p2 *[3]int // 数组指针
p2 = &g
p1 := &g
p2[1] = 222
// *p2[2] = 333 // 不行,注意优先级:优先[],invalid indirect of p2[2] (type int)
(*p2)[2] = 333
k1 := 1
k2 := 2
k3 := 3
var arr = [3]*int{&k1, &k2, &k3} // 指针数组:[0xc000012090 0xc000012098 0xc0000120a0]
fmt.Println(p, a, b, d, *e, p2, &p2, p1)
fmt.Println(arr)
s := []int{1, 2, 3, 4, 5} // 切片指针
p := &s
fmt.Println(p) // &[1 2 3 4 5] p指向s变量的地址,s地址存储的是切片的地址
pp := &p
fmt.Printf("%T,%T\n", p, pp) // *[]int,**[]int ; pp 为二级指针
// p为一级指针,指向变量的地址
// pp为二级指针,指向指针的地址
// 三级指针,,,