# Go 语言指针零基础入门详解

文章目录

Go 语言指针零基础入门详解

大家好~前面我们已经学了变量、函数、流程控制,今天正式进入 Go 指针 的世界!

很多新手觉得指针难,但其实指针就是 内存的门牌号,超级直观、超级简单。

带你彻底搞懂:指针是什么、怎么取地址、怎么解引用、nil 指针、Go 指针安全限制。

适合:零基础、刚学 Go、怕指针、想彻底搞懂内存 的同学。


一、指针到底是什么?

指针 = 内存地址

你可以把内存想象成一长排宿舍:

  • 每一间宿舍 = 一块内存

  • 房间号 = 内存地址

  • 房间里住的人 = 变量的值

指针 = 存 "房间号" 的变量

特点:

  • 指针本质是一个大整数

  • Go 给它单独定义了指针类型\*T

  • 不同类型指针不能混用(\*int ≠ \*string


二、指针的两个核心符号(记牢就成功一半)

Go 语言指针只有两个符号:

  1. & 取地址符 → 拿到变量的内存地址

  2. * 解引用符 → 通过地址访问变量的值

口诀:

&拿地址, *拿内容


三、第一步:取地址(&)

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 为了安全,对指针做了严格限制:

  1. 不支持指针算术运算
    ptr\+\+ptr\+1 都不行

  2. 不同类型指针不能混用
    \*int 不能转 \*string

  3. 类型必须严格匹配
    \*int 只能指向 int 变量


七、指针与函数(最常用场景)

Go 默认值传递,要修改外部变量必须传指针。

go 复制代码
func change(num *int) {
    *num = 999
}

func main() {
    a := 10
    change(&a)
    fmt.Println(a) // 999
}

八、本篇总结

  1. 指针 = 内存地址

  2. \&amp;变量 → 取地址

  3. \*指针 → 取值 / 修改

  4. 指针类型:\*int\*string\*bool

  5. 未初始化指针 = nil

  6. Go 指针安全,不支持运算

  7. 函数要修改外部变量 → 传指针


如果你也在 零基础学 Go ,欢迎关注我!

我会持续更新:

✅ Go 基础语法

✅ 指针详解

✅ 数据结构

✅ 顺序表 / 链表 / 栈 / 队列

下一篇:线性表基本原理 + 顺序表 + 链表

👉 点赞 + 收藏 + 关注,更新第一时间不迷路!


(注:文档部分内容可能由 AI 生成)

相关推荐
爱勇宝5 小时前
第 1 章:别把“需求文档”当成真正的需求
前端·后端·程序员
认真的酒窝6 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
wbs_scy7 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录9177 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
贪玩的蛋挞8 小时前
C#与闭包
开发语言·c#
端庄的战斗机8 小时前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
开发小程序的之朴9 小时前
认识安企CMS-安装安企CMS的环境要求
nginx·golang·系统架构
Full Stack Developme9 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
IT_陈寒10 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
C语言小火车10 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序