我想了解指针在Go中的工作原理。总体上,我对指针的经验很少,因为我主要使用javascript。
我写了这个虚拟程序:
func swap(a, b *int) {
fmt.Println("3", &a, &b)
*a, *b = *b, *a
fmt.Println("4", a, b)
}
func main() {
x := 15
y := 2
fmt.Println("1", x, y)
fmt.Println("2", &x, &y)
swap(&x, &y)
fmt.Println("5", x, y)
}
以下是输出的结果:
$ go run test.go
1 15 2
2 0x208178170 0x208178178
3 0x2081ac020 0x2081ac028
4 0x208178178 0x208178170
5 2 15
我有几个问题:
根据我的理解,
&x
给出x
存储的地址。要获取 x 的实际值,需要使用*x
。那么,我不明白为什么&x
是*int
类型。由于*x
和&x
都是*int
类型,它们之间的区别对我来说并不清楚。在我的 swap 函数中,使用
*a, *b = *b, *a
和使用a, b = b, a
有什么区别?两者都可以工作,但我无法解释原因...为什么在第二步和第三步之间打印时地址不同?
为什么我不能直接修改地址,例如将
&b
分配给&a
?
x
的实际值是x
。如果参数a
存储了x
的地址,则*a
给出了x
的值。 - Kerrek SBa
和b
。 - twotwotwoa, b = b, a
在你的swap
函数内交换了可访问的指针,但它并没有从main
的角度交换值:输出的最后一行变成了5 15 2
。http://play.golang.org/p/rCXDgkZ9kG - twotwotwo