golang指针浅析
我们先来看一段简单的代码
func main() {
person := Person{"Alice", 20}
fmt.Printf("%p\n", &person)
p1 := &person
fmt.Printf("%p\n", p1)
fmt.Printf("%p\n", &p1)
}
type Person struct {
name string
age int
}
输出结果为
0xc000004440
0xc000004440
0xc000006030
我们定义了person变量
&是取地址符,所以&person表示地址,也表示指针
然后格式化打印出person在内存中地址
然后定义了p1变量,为&person,也就是person的指针
然后打印p1变量指向的地址
然后打印p1变量自身的地址
我们可以这样理解
person的内容在内存中占据了一块空间
这块空间的地址为0xc000004440
这块空间里面保存了
person的内容,包括name和age
person指向这块空间,这块空间的地址为0xc000004440
然后又来了一个变量p1
p1的内容在内存中占据了一块空间
这块空间的地址为0xc000006030
这块空间里面保存了
的内容是person的地址0xc000004440
所以实际上
变量只是一个别名而已
只是一块内存地址的别名
0xc000004440的别名为person
里面保存了person的内容包括name,age
0xc000006030的别名为p1
里面保存了0xc000004440
也就是person的内存地址
同样的道理
p2 := &p1
fmt.Printf("%p\n", p2)
fmt.Printf("%p\n", &p2)
打印结果为
0xc000006030
0xc000006038
0xc000006038的别名为p2
里面保存了0xc000006030
也就是p1的内存地址