
在 go 中,需先声明普通变量,再用取地址符 & 获取其指针,然后将该指针传入接受 *t 类型参数的函数,才能通过解引用 *ptr 修改原始变量的值。
Go 并不支持 C 风格的“指针变量声明即初始化”语法(如 oneptr *int),也不允许未初始化的指针直接解引用。正确的做法是:先声明一个普通变量,再通过 &变量名 获得其内存地址(即指针值),最后将该指针传入函数。
以下为修正后的完整示例:
package main
import "fmt"
func zeroptr(ptr *int) {
*ptr = 0 // 解引用并修改原始变量的值
}
func main() {
var ptr int // 声明一个 int 类型的普通变量(自动初始化为 0)
ptr = 1 // 显式赋值为 1
fmt.Println("ptr is :", ptr) // 输出: ptr is : 1
zeroptr(&ptr) // 传入 ptr 的地址(*int 类型)
fmt.Println("after calling zeroptr, the value of ptr is :", ptr) // 输出: after calling zeroptr, the value of ptr is : 0
}⚠️ 关键要点说明:
- ❌ 错误写法:oneptr int 是非法的变量声明(Go 不支持此语法);ptr = 1 也因 ptr 未定义而编译失败。
- ✅ 正确流程:var x int → &x 得到 int → 传给形参为 int 的函数 → 在函数内用 *ptr = ... 修改原变量。
- ? 指针本质:Go 中的指针是保存变量内存地址的值,不是独立的“指针类型变量”容器;&x 是取址操作,*p 是解引用操作,二者必须配对使用且目标必须已分配内存。
- ? 补充提示:若需动态分配内存,可使用 new(T)(返回 *T,值为零值)或 &T{...}(取结构体字面量地址)。
掌握这一模式,是理解 Go 中函数间共享与修改状态、实现高效内存操作(如避免大结构体拷贝)的基础。










