第12天:指针基础
学习目标
在本节课中,我们将深入了解Go语言中的指针概念及其用法,帮助你理解如何使用指针来优化内存管理和提高程序性能。
一、指针概念
指针是一个变量,它存储另一个变量的内存地址。在Go语言中,指针有助于实现以下目标:
- 提高性能:通过传递指针而非复制值,可以节省内存空间。
- 间接访问:允许你间接访问和修改数据。
二、指针的基本语法
- 声明指针:使用
*
符号来声明一个指针类型。 - 获取地址:使用
&
符号获取变量的内存地址。 - 解引用:使用
*
符号解引用指针,访问指针所指向的值。
三、指针的基本用法
3.1 声明指针
var ptr *int
3.2 获取地址
x := 42
ptr = &x // ptr现在指向x的内存地址
3.3 解引用
fmt.Println(*ptr) // 输出 42
*ptr = 100 // 修改x的值为100
fmt.Println(x) // 输出 100
四、指针的重要特性
特性 | 描述 |
---|---|
零值指针 | 指针的零值是 nil ,表示没有指向任何有效的内存 |
指针可以被锁定 | Go语言中的指针可以被作为函数参数传递,保持其锁定 |
不同类型的指针 | 可声明指向不同数据类型的指针 |
五、指针与值的比较
在Go中,值类型和引用类型的主要区别在于内存管理:
- 值类型:例如
int
,float
,bool
等,通常发生值的复制。 - 引用类型:例如,指针、切片、映射和通道,传递的是对实际数据的引用。
例子对比
func modifyValue(val int) {
val = 100 // 这个修改不会影响main中的x
}
func modifyPointer(ptr *int) {
*ptr = 100 // 这个修改会影响main中的x
}
func main() {
x := 42
modifyValue(x)
fmt.Println(x) // 输出 42
modifyPointer(&x)
fmt.Println(x) // 输出 100
}
六、指针的使用场景
-
函数参数传递
- 可以减少内存消耗。
- 修改函数外的变量。
-
构建链表、树等数据结构
- 必须使用指针来建立节点间的关系。
七、指针的安全性
Go是注重安全性的语言,指针的使用要谨慎:
- 使用
nil
前应判断指针是否为nil
。 - 不要解引用
nil
指针。
八、代码示例与运行流程
示例代码:使用指针进行数据修改
package main
import "fmt"
func updateValue(x *int) {
*x = 50 // 更新指针指向的值
}
func main() {
value := 10
fmt.Println("Before update:", value) // 输出 10
updateValue(&value) // 传递指针
fmt.Println("After update:", value) // 输出 50
}
运行流程图
+---------------------------+
| main |
+---------------------------+
| value := 10 |
| print 10 |
| updateValue(&value) |
|---------------------------|
| |
| +----------------------+ |
| | updateValue | |
| +----------------------+ |
| x := *int (指向value) |
| *x = 50 (改变value) |
| |
+---------------------------+
九、指针的进阶用法
9.1 使用多重指针
多重指针是指向指针的指针,例如 **int
,用于复杂的数据结构:
func main() {
var x int = 10
var px *int = &x // px是指向x的指针
var ppx **int = &px // ppx是指向px的指针
fmt.Println(**ppx) // 输出 10
}
9.2 nil指针的处理
在进行指针操作时,务必要检查指针是否为 nil
:
var ptr *int
if ptr != nil {
fmt.Println(*ptr) // 安全访问
} else {
fmt.Println("ptr is nil")
}
十、总结
指针在Go语言中是一个强大而重要的工具。通过理解指针的概念、用法及其在各种场景下的应用,你可以更深入地掌握Go语言,为编写高效、可维护的程序奠定基础。
十一、实践与作业
在了解指针的基础上,试着完成以下练习:
- 编写函数,接受指向整型数组的指针,计算并返回数组的总和。
- 实现链表,包括插入、删除和打印功能,使用指针来连接节点。
怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!
标签:12,15,int,fmt,Println,Go,ptr,指针 From: https://blog.csdn.net/weixin_40780178/article/details/143104651