GO_复合类型---指针

📅 2026/7/11 21:28:39
GO_复合类型---指针
一、变量的两层含义内存空间 内存地址Go 中每一个普通变量都包含两层概念变量内存空间用来存储数值类比教室变量地址内存的编号通过变量名获取类比教室门牌号示例代码gopackage main import fmt func main() { var a int a 10 fmt.Printf(a 的值%v\n, a) // 内存中存储的值 fmt.Printf(a 的地址%v\n, a) // 变量内存地址 }二、指针类型核心概念1. 指针的作用普通变量存储数值指针变量存储另一个变量的内存地址。2. 指针类型规则*intint 类型的指针存储 int 变量的地址**int二级指针存储*int指针变量的地址3. 指针基础语法取地址、解引用变量取变量的内存地址赋值给指针*指针变量解引用通过指针操作指向的内存原值完整示例gopackage main import fmt func main() { var a int 100 // 1. 定义int类型指针 var p *int // 2. 给指针赋值存储a的地址 p a fmt.Printf(a的值%d\n, a) fmt.Printf(a的地址%p\n, a) fmt.Printf(指针p存储的地址%p\n, p) // 3. 解引用通过指针修改原变量的值 *p 555 fmt.Printf(解引用修改后*p%d , a%d\n, *p, a) }核心结论修改*p会直接修改原变量a的值因为二者指向同一块内存空间。三、Go 指针专属特性高频考点1. 无-操作符C/C 指针访问成员用-Go 语言没有-统一使用.访问成员语法统一极简。2. 禁止操作无合法指向的指针核心坑点声明指针但不赋值指针默认值为nil无任何合法内存指向禁止解引用会直接报错 panic。错误示例绝对禁止govar p *int // p 为 nil无合法内存解引用直接崩溃 *p 100 // panic: runtime error: invalid memory address or nil pointer dereference正确规则指针必须指向合法内存空间才能进行解引用操作。四、new 函数快速创建合法指针内存1. new 函数作用为指定类型T分配一块清零的内存空间返回该内存的指针地址保证指针有合法指向。2. 特性分配的内存默认零值初始化Go 自动垃圾回收无需手动释放内存专门用来解决指针 nil 非法访问问题使用示例gopackage main import fmt func main() { // 方式1new创建合法int指针 p : new(int) *p 666 fmt.Println(*p , *p) // 方式2简写 q : new(int) *q 888 fmt.Println(*q , *q) }五、值传递 vs 地址传递指针核心应用Go 语言所有函数参数都是值传递想要修改原变量必须传指针地址传递模拟。1. 值传递无法修改原值函数内部拷贝变量副本修改的是副本原变量不受影响。gofunc swap(a, b int) { // 仅修改副本外部原值不变 a, b b, a } func main() { x, y : 10, 20 swap(x, y) fmt.Println(x, y) // 输出10 20 无变化 }2. 地址传递指针传参修改原值传递变量地址函数内部通过指针解引用直接操作原变量内存实现原值修改。gopackage main import fmt // 接收int指针类型 func swap(p1, p2 *int) { // 解引用交换原值 *p1, *p2 *p2, *p1 } func main() { a, b : 10, 20 // 传变量地址 swap(a, b) fmt.Println(a, b) // 输出20 10 交换成功 }六、本章指针核心总结复习必背变量 内存值 内存地址取地址*解引用Go 指针无-统一使用.访问成员nil 指针禁止解引用必须保证合法内存指向new(T)分配清零内存返回指针解决空指针问题Go 只有值传递想要改原值必须传指针地址传递指针核心用途修改变量原值、避免大内存拷贝