Menu
CoddyTech

Go 中的指针基础

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 19 课,共 107 课。

指针是一种存储另一个变量内存地址的变量。它不直接保存值,而是保存该值在内存中的位置。指针对 Go 至关重要,也是高效处理数据的基础。

要创建指针,请使用 & 运算符获取变量的地址,并使用 * 运算符声明指针类型,或访问该地址处的值。

x := 42
p := &x  // p 保存着 x 的内存地址

fmt.Println(p)  // 0xc000018030(内存地址)
fmt.Println(*p) // 42(该地址处的值)

& 运算符表示“取地址”,并返回一个指针。* 运算符用于指针时,表示“取值”,这个操作称为解引用。你还可以通过指针修改原始值。

x := 10
p := &x

*p = 25         // 通过指针修改值
fmt.Println(x)  // 25(原变量的值已改变)

指针类型写作 *T,其中 T 是指针指向的类型。指向 int 的指针类型是 *int。

var p *int      // 声明一个指向 int 的指针
x := 100
p = &x          // p 现在指向 x

指针的零值是 nil,这表示它不指向任何内容。尝试解引用 nil 指针会导致运行时恐慌,因此使用指针前一定要确保已将其初始化。

challenge icon

挑战

简单

让我们构建一个简单的值交换器,展示如何通过指针和内存地址修改变量。

你需要将代码分成两个文件:

  • swap.go:创建一个名为 SwapValues 的函数,它接受两个 *int 指针作为参数。这个函数应交换这两个指针指向的值。调用后,每个变量都应保存对方原来的值。这个函数不返回任何内容,而是直接通过指针修改值。
  • main.go:从输入中读取两个整数,将它们存入变量,然后使用你的 SwapValues 函数交换它们的值。在交换前后打印这两个值,以展示变化。

将提供以下输入:

  • 第 1 行:第一个整数
  • 第 2 行:第二个整数

输出格式:

Before: a=[first] b=[second]
After: a=[first] b=[second]

例如,给定 10 和 25,你的输出应为:

Before: a=10 b=25
After: a=25 b=10

记得在将变量传给函数时使用 & 运算符,并在函数内部使用 * 运算符来访问和修改实际值。

亲手试试

package main

import "fmt"

func main() {
	// 从输入中读取两个整数
	var a, b int
	fmt.Scanln(&a)
	fmt.Scanln(&b)

	// 输出交换前的值
	fmt.Printf("Before: a=%d b=%d\n", a, b)

	// TODO: 用指向 a 和 b 的指针调用 SwapValues 函数
	// 记得用 & 运算符传递地址

	// 输出交换后的值
	fmt.Printf("After: a=%d b=%d\n", a, b)
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Go 在线编译器