文章目录
- [Go 语言指针零基础入门详解](#Go 语言指针零基础入门详解)
- 一、指针到底是什么?
- 二、指针的两个核心符号(记牢就成功一半)
- 三、第一步:取地址(\&)
- 四、第二步:解引用取值(\*)
- [五、nil 空指针](#五、nil 空指针)
- [六、Go 指针的安全限制](#六、Go 指针的安全限制)
- 七、指针与函数(最常用场景)
- 八、本篇总结
Go 语言指针零基础入门详解
大家好~前面我们已经学了变量、函数、流程控制,今天正式进入 Go 指针 的世界!
很多新手觉得指针难,但其实指针就是 内存的门牌号,超级直观、超级简单。
带你彻底搞懂:指针是什么、怎么取地址、怎么解引用、nil 指针、Go 指针安全限制。
适合:零基础、刚学 Go、怕指针、想彻底搞懂内存 的同学。
一、指针到底是什么?
指针 = 内存地址
你可以把内存想象成一长排宿舍:
-
每一间宿舍 = 一块内存
-
房间号 = 内存地址
-
房间里住的人 = 变量的值
指针 = 存 "房间号" 的变量
特点:
-
指针本质是一个大整数
-
Go 给它单独定义了指针类型 (
\*T) -
不同类型指针不能混用(
\*int ≠ \*string)
二、指针的两个核心符号(记牢就成功一半)
Go 语言指针只有两个符号:
-
& 取地址符 → 拿到变量的内存地址
-
* 解引用符 → 通过地址访问变量的值
口诀:
&拿地址, *拿内容
三、第一步:取地址(&)
go
package main
import "fmt"
func main() {
a := 10
ptr := &a // 取 a 的地址
fmt.Printf("a 的值:%d\n", a)
fmt.Printf("a 的地址:%p\n", &a)
fmt.Printf("ptr 存储的地址:%p\n", ptr)
fmt.Printf("ptr 的类型:%T\n", ptr)
}
运行结果:
Plain
a 的值:10
a 的地址:0xc0000a0080
ptr 存储的地址:0xc0000a0080
ptr 的类型:*int
结论:
ptr = \&a → ptr 就是 a 的地址。
四、第二步:解引用取值(*)
通过指针访问 / 修改变量:
go
func main() {
a := 10
ptr := &a
fmt.Println(*ptr) // 输出 10
*ptr = 999 // 通过指针修改 a
fmt.Println(a) // a 变成 999
}
核心理解:
\*ptr ** 就是变量 a 本身**
修改 \*ptr = 直接修改变量 a 的值。
五、nil 空指针
未初始化的指针 = nil(空)。
go
var ptr *int
fmt.Println(ptr) // <nil>
⚠️ 禁止对 nil 解引用,会直接崩溃。
go
// 错误
var ptr *int
*ptr = 100 // panic
六、Go 指针的安全限制
Go 为了安全,对指针做了严格限制:
-
不支持指针算术运算
ptr\+\+、ptr\+1都不行 -
不同类型指针不能混用
\*int不能转\*string -
类型必须严格匹配
\*int只能指向int变量
七、指针与函数(最常用场景)
Go 默认值传递,要修改外部变量必须传指针。
go
func change(num *int) {
*num = 999
}
func main() {
a := 10
change(&a)
fmt.Println(a) // 999
}
八、本篇总结
-
指针 = 内存地址
-
\&变量→ 取地址 -
\*指针→ 取值 / 修改 -
指针类型:
\*int、\*string、\*bool -
未初始化指针 =
nil -
Go 指针安全,不支持运算
-
函数要修改外部变量 → 传指针
如果你也在 零基础学 Go ,欢迎关注我!
我会持续更新:
✅ Go 基础语法
✅ 指针详解
✅ 数据结构
✅ 顺序表 / 链表 / 栈 / 队列
下一篇:线性表基本原理 + 顺序表 + 链表
👉 点赞 + 收藏 + 关注,更新第一时间不迷路!
(注:文档部分内容可能由 AI 生成)