# 指针图解

简单了解指针:

  • 变量 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

结果:

// 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

原因分析

需要交换值得正确代码:

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

# 相关连接

上次更新: 1/8/2024,