16_指针地址与修改
理解 `&`、`*`、nil 指针和指针参数。
Go 基础专题 16:指针、地址与修改
学习目标:理解
&、*、nil 指针和指针参数。
核心知识
指针保存另一个值的地址。&value 取得地址,*pointer 访问地址所指的值。把指针传给函数时,函数可以修改调用方变量;直接传整数值则只复制整数。Go 没有普通指针算术,不能像 C 那样随意移动地址。
package main
import "fmt"
func increase(value *int) {
*value = *value + 1
}
func main() {
count := 3
increase(&count)
fmt.Println(count) // 4
}
指针的零值是 nil,对 nil 指针解引用会 panic。函数若允许 nil,先检查 if value == nil { ... };若不允许,接口契约要写清。结构体的方法可以用指针接收者,便于修改实例并避免复制较大的结构体。
指针不一定比值传递“更快”;它可能增加共享状态与内存管理成本。选择依据是是否需要修改原值、对象大小及语义。切片和 map 已含内部引用,传它们时通常不需再加一层指针。
逐步理解
把指针想作“访问原变量的地址”,但仍需关注所有权:谁可以修改它,调用结束后是否还会共享。示例中 increase(&count) 改变的是 main 里的 count;若参数写 value int,只会改函数自己的副本。先判断 nil 再解引用,特别是在可选输入或查找结果中。
动手练习
练习:写 reset(value *int) 把数字设为 0。答案要点:检查非 nil 后 *value = 0。