
go 中不能直接声明未初始化的指针变量(如 `oneptr *int`),而应先声明普通变量,再用取地址符 `&` 获取其指针,然后传入函数;函数接收 `*t` 类型参数并通过解引用 `*ptr` 修改原值。
在 Go 中,指针是显式且安全的:你必须先拥有一个已定义的变量,再通过 &variable 获取其内存地址,从而得到一个指向该变量的指针。Go 不允许声明一个“悬空”或未绑定的指针(例如 var p *int 并不分配可安全解引用的底层存储),因为这会带来不确定性风险。
下面是一个完整、可运行的示例,演示如何正确定义整型变量、获取其指针、传入函数并修改原始值:
package main
import "fmt"
func zeroptr(ptr *int) {
*ptr = 0 // 解引用并赋值,直接影响原始变量
}
func main() {
var x int // 声明一个普通 int 变量
x = 1 // 初始化为 1
fmt.Println("x is:", x) // 输出: x is: 1
zeroptr(&x) // 传入 x 的地址(*int 类型)
fmt.Println("after calling zeroptr, x is:", x) // 输出: after calling zeroptr, x is: 0
}⚠️ 注意事项:
- &x 是取地址操作,类型为 *int;*ptr 是解引用操作,用于读写 ptr 所指向的值;
- 错误写法 oneptr *int; *oneptr = 1 会导致 panic:invalid memory address or nil pointer dereference,因为 oneptr 是 nil 指针,未指向有效内存;
- 若需动态分配内存,可用 new(T) 或 &T{},例如:p := new(int) 等价于 p := &int{0},此时 p 指向一个零值初始化的 int,可安全解引用。
总结:Go 的指针设计强调明确性与安全性——指针必须有明确的指向目标,修改指针所指内容即等价于修改原始变量本身。掌握 &(取地址)和 *(解引用)的配对使用,是理解 Go 内存模型与函数参数传递机制的关键基础。









