💜 想真正擅长编程? 从一门课程开始,100% 免费

《笔记》第九篇 Go指针说明(二)

第09讲 Go指针说明(二)

本讲义根据视频实际讲解内容整理

一、本讲概述

本讲是指针内容的续篇,通过代码实操演示了如何声明变量、用取地址运算符 & 获取内存地址,并对比了 Go(有指针)和 Python(无指针)在变量内存地址行为上的差异。


二、实操演示:获取变量内存地址

2.1 声明变量并取地址

老师在课堂上演示了以下代码:

Go
package main

import "fmt"

func main() {
    var a uint = 10  // 声明一个无符号整型变量
    var b = &a       // b 存储 a 的内存地址

    fmt.Println(b)   // 输出类似 0xc00001a0b0
}

2.2 关于 0x 前缀

老师特别讲解了输出结果中 0x 的含义:

  • 0x 代表十六进制(Hexadecimal)
  • 这不是二进制的 0 和 1,而是十六进制表示法
  • 内存地址通常用十六进制表示,便于阅读

"0X代表的就是16进制,这就是 A 在内存中的地址。"


三、内存地址不变,值可变

3.1 关键演示

老师演示了一个重要概念:修改变量的值,内存地址不会变。

Go
package main

import "fmt"

func main() {
    var a uint = 10
    var b = &a

    fmt.Println("a的地址:", b)   // 打印地址
    fmt.Println("a的值:", a)    // 10

    a = 20  // 修改 a 的值

    fmt.Println("修改后a的地址:", b)  // 地址不变!
    fmt.Println("修改后a的值:", a)   // 20
}

3.2 核心结论

"内存地址不变,只是值变了。"

  • 变量声明后,其内存地址就固定了
  • 修改变量的值,只是改变了该地址上存储的数据
  • 其他通过指针引用该地址的地方,看到的也是更新后的值(共享)

四、Go vs Python:指针的对比

4.1 Python 没有指针

老师为了加深理解,对比演示了 Python 的行为:

Python
# Python 代码
a = 10
a = 20
  • Python 中没有指针的概念
  • 当 a = 20 时,实际上是创建了一个新的内存空间,a 指向了新地址
  • 原来的 10 的内存空间会被垃圾回收

4.2 Go 有指针

Go
// Go 代码
var a int = 10
a = 20  // 值变了,但地址不变
  • Go 中修改变量值时,内存地址保持不变
  • 只是在同一块内存上更新了数据

4.3 对比总结

特性 Go Python
指针 有 无
变量重新赋值 地址不变,值更新 创建新对象,地址变化
内存共享 通过指针共享同一地址 无法直接共享内存地址

"Python 没有指针,调整数值时地址绝对不一样。但是 Go 的地址一样,这就是指针的区别。"


五、小结

本讲通过实际代码对比,加深了对指针的理解:

  1. 取地址:用 & 运算符获取变量的内存地址,结果为 0x 开头的十六进制
  2. 地址不变性:变量值改变时,内存地址保持不变
  3. Go 与 Python 对比:Go 有指针,修改变量时地址不变;Python 无指针,重新赋值时地址会变化

老师提到指针是一个需要详细讲解的话题,后续会继续深入。