Go 中如何正确声明指针并传递给函数以修改其指向的值

在 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 中函数间共享与修改状态、实现高效内存操作(如避免大结构体拷贝)的基础。