什么是指针
取址运算符、解引用与 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 反馈 — 无需本地设置。