0Pricing
Go Academy · 课时

什么是指针

取址运算符、解引用与 nil 指针

什么是指针 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

内存地址

每个变量都位于某个内存地址。指针会存储该地址。在 Go 中,指针具有类型:*int 保存 int 的地址。

取址运算符 &

使用 & 获取变量的地址:

package main
import "fmt"

func main() {
    x := 42
    p := &x
    fmt.Println(p)  // 0xc000... (address)
    fmt.Println(*p) // 42 (value at address)
}

解引用 *

使用 * 读取或写入指针地址处的值:

package main
import "fmt"

func main() {
    n := 10
    p := &n
    *p = 99
    fmt.Println(n) // 99
}

nil 指针

指针的零值是 nil。解引用 nil 指针会导致程序崩溃:

package main
import "fmt"

func main() {
    var p *int
    fmt.Println(p)        // <nil>
    fmt.Println(p == nil) // true
    // *p = 1 — PANIC
}

指针类型

每种指针类型都对应其所指向的类型:

package main
import "fmt"

func main() {
    i := 1
    s := "hello"
    pi := &i   // *int
    ps := &s   // *string
    fmt.Printf("%T %T\n", pi, ps) // *int *string
}

使用前检查 nil

在解引用从代码外部接收的指针之前,务必检查它是否为 nil:

package main
import "fmt"

func printInt(p *int) {
    if p == nil {
        fmt.Println("nil pointer")
        return
    }
    fmt.Println(*p)
}

func main() {
    v := 7
    printInt(&v)
    printInt(nil)
}

指向结构体的指针

通过指针访问结构体字段时使用相同的点号表示法,Go 会自动解引用:

package main
import "fmt"

type Point struct{ X, Y int }

func main() {
    p := &Point{1, 2}
    p.X = 10         // same as (*p).X = 10
    fmt.Println(*p)  // {10 2}
}

指针比较

当两个指针指向同一个变量(地址相同)或都为 nil 时,它们相等:

package main
import "fmt"

func main() {
    a := 1
    p1 := &a
    p2 := &a
    p3 := new(int)
    *p3 = 1
    fmt.Println(p1 == p2) // true  — same address
    fmt.Println(p1 == p3) // false — different address
}

栈与堆

Go 的编译器通过逃逸分析决定变量位于栈上还是堆上。当您获取局部变量的地址并返回它时,Go 会自动将其移到堆上,无需手动管理。

何时不应使用指针

并非所有内容都需要指针:

  • 小型值类型(整数、布尔值、小型结构体)复制起来比解引用更高效
  • 在协程之间共享的不可变数据作为值使用是安全的
  • 主要在需要修改数据或处理大型结构体时使用指针

快速检查

& 运算符返回什么?

回顾:指针

要点:

  • &v 获取地址,*p 对其进行解引用
  • 零值是 nil,解引用前务必检查
  • 访问结构体指针字段时,Go 会自动解引用
  • 逃逸分析会自动管理栈与堆

练习提示

编写函数 swap(a, b *int),使用指针交换两个整数的值。在 main 中调用它,并打印交换前后的值。

常见问题解答

「什么是指针」课时是免费的吗?

是的 — 「什么是指针」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「什么是指针」这节课中我会学到什么?

取址运算符、解引用与 nil 指针 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「什么是指针」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 什么是指针
  2. 指针与函数
  3. 方法中的指针接收者
  4. new() 与指针的使用时机
← 返回 Go Academy