# 指针图解
简单了解指针:

- 变量 b 存储的值是 88,存储的地址是:0xc00000e0b8
- 变量 a 存储了变量 b 的地址,现在可以说 a 指向 b
# 代码分析
分析以下代码输出的是什么?
package main
import "fmt"
func swap(a, b *int) (*int , *int) {
b, a = a, b
return a, b
}
func main() {
x, y := 1, 2
fmt.Println("x的初始地址:", &x, "y的初始地址:", &y)
a, b := swap(&x, &y)
fmt.Println("swap 后x的值:", x, "swap 后y的值::", y)
fmt.Println("swap 后x的地址:", &x, "swap 后y的地址:", &y)
fmt.Println("swap 后a的值:", a, "swap 后b的值:", b)
fmt.Println("swap 后a指向的值:", *a, "swap 后b指向的值:", *b)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
结果:
// x的初始地址: 0xc00000e0b8 y的初始地址: 0xc00000e0d0
// swap 后x的值: 1 swap 后y的值:: 2
// swap 后x的地址: 0xc00000e0b8 swap 后y的地址: 0xc00000e0d0
// swap 后a的值: 0xc00000e0d0 swap 后b的值: 0xc00000e0b8
// swap 后a指向的值: 2 swap 后b指向的值: 1
1
2
3
4
5
2
3
4
5
原因分析

需要交换值得正确代码:
package main
import "fmt"
// 交换函数
func swap(a, b *int) {
// 取a指针的值, 赋给临时变量t
t := *a
// 取b指针的值, 赋给a指针指向的变量
*a = *b
// 将a指针的值赋给b指针指向的变量
*b = t
}
func main() {
// 准备两个变量, 赋值1和2
x, y := 1, 2
// 交换变量值
swap(&x, &y)
// 输出变量值
fmt.Println(x, y)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19