pointers.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. /*
  7. swap(a, b *int) 这个函数可以把两个整数的值互换,但它需要这两个整数的“地址”(指针),这样它才能直接修改原始变量的值。
  8. 你可以想象x和y是两个盒子,分别装着42和99。swap函数要交换它们盒子里的东西,但只能拿到盒子的“门牌号”(地址),这样它才能真的改动盒子里的东西。
  9. 在swap函数里,先把a指向的数字(就是x的值)存进一个临时变量tmp。
  10. 然后把b指向的数字(y的值)放到a指向的地方(x的位置)。
  11. 最后把tmp(原来x的值)放到b指向的地方(y的位置)。至此,x和y的值就交换了。
  12. main函数里,先打印交换前x和y的值,然后通过&x、&y把x和y的地址传给swap,交换成功后再打印一次,看到值已经互换。
  13. */
  14. // 交换函数:传入两个int类型的指针参数
  15. func swap(a, b *int) {
  16. // 用临时变量tmp先保存a指向的值
  17. tmp := *a // *a表示a指向的地址中存储的值
  18. *a = *b // 把b指向的值赋给a指向的内存单元
  19. *b = tmp // 把刚才保存的a的值赋给b指向的内存单元
  20. }
  21. func main() {
  22. x, y := 42, 99 // 定义两个整型变量x和y
  23. fmt.Printf("交换前 x=%d, y=%d\n", x, y)
  24. swap(&x, &y) // 传入变量x、y的地址,实现交换
  25. fmt.Printf("交换后 x=%d, y=%d\n", x, y)
  26. fmt.Printf("\n%s\n\n", strings.Repeat("*", 88))
  27. var a int = 20 // 声明实际变量
  28. var ip *int // 声明指针变量
  29. ip = &a // 指针变量的存储地址
  30. fmt.Printf("a 变量的地址是: %x\n", &a)
  31. // 指针变量的存储地址
  32. fmt.Printf("ip 变量储存的指针地址: %x\n", ip)
  33. // 使用指针访问值
  34. fmt.Printf("*ip 变量的值: %d\n", *ip)
  35. // 空指针
  36. var ptr *int
  37. fmt.Printf("ptr 的值为: %x\n", ptr)
  38. fmt.Printf("%x\n", &ptr)
  39. }