Golang中的指针是指内存地址还是值

Go语言中指针是存储内存地址的变量,其值为地址而非数据本身;通过*操作符解引用可访问或修改所指变量的值;指针与所指变量相互独立,修改指针不影响原变量。

Go语言中的指针本身是一个变量,它存储的是另一个变量的内存地址,而不是值。

指针的本质是地址

当你声明一个指针,比如 var p *int,变量 p 的值就是一个内存地址(例如 0xc0000140a0),这个地址指向某个 int 类型变量在内存中的位置。指针变量有自己的内存空间,里面存的不是数据本身,而是数据所在位置的编号。

通过指针访问或修改值需要解引用

要拿到指针所指向的值,必须用 * 操作符“解引用”:

  • *p 表示“取地址 p 所指位置上的值”
  • *p = 42 表示“把 42 写入 p 所指的内存位置”

指针变量和它指向的值是两个独立的实体

比如:

x := 10
ptr := &x // ptr 存的是 x 的地址
*ptr = 20 // 修改的是 x 的值,x 现在变成 20
ptr = nil // 只让 ptr 不再指向任何地方,不影响 x 本身

这里 ptr 是地址容器,x 是值容器,二者生命周期和修改互

不自动影响。

常见误区:指针不是“间接值”,而是“地址值”

有人误以为 *p 是指针的“值”,其实 *p 是对指针的使用结果;p 本身的值永远是地址。就像身份证号本身不是人,但能定位到那个人——指针就是变量的“身份证号”。