# 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 生成)

相关推荐
4***17545 小时前
3.3 Python图形编程
开发语言·python·pygame
橙子圆1235 小时前
java之拦截器和适配器模式
java·开发语言
时空系5 小时前
第3篇:数据的运算——让数据动起来 Rust中文编程
开发语言·后端·rust
Shadow(⊙o⊙)5 小时前
智能指针、循环引用、锁、删除器
开发语言·c++·后端·visual studio
星浩AI5 小时前
OpenAI 大神 Karpathy 开源:用 Obsidian 实现 LLM Wiki 知识库管理方法
后端·openai·agent
Sylvia-girl5 小时前
C++模板【上】
开发语言·c++
2zcode5 小时前
基于MATLAB多特征融合与SVM的金属表面缺陷检测系统
开发语言·支持向量机·matlab
2zcode5 小时前
基于MATLAB脑电信号的帕金森病抑郁症检测研究
开发语言·matlab·抑郁症·帕金森病
untE EADO5 小时前
Java进阶之路,Java程序员职业发展规划
java·开发语言