如何使用Golang指针引用与解引用_读取和修改内存地址内容

Go语言指针用于操作变量内存地址,通过&取地址、*解引用实现读写;传指针可使函数修改原变量;需防nil解引用、注意逃逸分析与栈变量地址安全。

Go语言中的指针用于直接操作变量的内存地址,通过指针可以读取(解引用)或修改(赋值给解引用后的指针)原变量的值。理解指针的关键在于区分“取地址”(&)和“解引用”(*)两个操作。

如何获取变量地址并创建指针

使用 & 操作符可获取变量的内存地址,结果是一个指针类型值:

  • x := 42 定义一个整数变量;
  • ptr := &xx 的地址赋给 ptr,此时 ptr 的类型是 *int
  • 指针变量本身也占用内存,它存储的是另一个变量的地址,不是值。

如何解引用指针读取或修改原变量

使用 * 操作符对指针进行解引用,访问其所指向的变量内容:

  • fmt.Println(*ptr) 输出 42,即读取 x 的当前值;
  • *ptr = 100x 的值改为 100,等价于 x = 100
  • 解引用前必须确保指针非 nil,否则运行时 panic(如 var p *int; fmt.Println(*p) 会崩溃)。

指针在函数参数中传递的实际效果

Go 默认按值传递,但传入指针可让函数修改调用方的原始变量:

  • 定义函数 func double(n *int) { *n *= 2 }
  • 调用 num := 5; double(&num) 后,num 变为 10
  • 这不同于传值(如 func double(n int)),后者只能修改副本,不影响原变量。

常见注意事项与安全提醒

指针虽高效,但需注意几个关键点:

  • 未初始化的指针默认为 nil,解引用前应判空(if ptr != nil { ... });
  • 局部变量的地址可安全返回,Go编译器会自动做逃逸分析,将其分配到堆上;
  • 不要返回栈上临时变量的地址(如循环中创建的变量地址),但Go通常能检测并拒绝这类错误;
  • 结构体字段若为指针类型,其零值是 nil,访问前须检查或显式初始化。