开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:指针案例和使用陷阱】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9535
指针案例和使用陷阱
内容介绍:
一、案例演示
二、课堂练习
三、指针的使用细节
一、案例演示
要求:
①写一个程序,获取一个 int 变量 num 的地址,并显示到终端
②将 num 的地址赋值给指针 ptr,并通过 ptr 去修改 num 的值
(1)程序代码
第①题
package main
import "fmt"
func main() {
var num int = 9
fmt.Printf("num address=%v",&num)
}
输出结果:
num address= 0xc04204e080
第②题
package main
import "fmt"
func main() {
var num int = 9
//对num赋值为9
fmt.Printf("num address=%v\n",&num)
var ptr *int
ptr = &num
//将num的地址赋值给指针 ptr
*ptr = 10
//给ptr重新赋值,这里改变时,会改变num的值
fmt.Println("num =",num)
}
输出结果:
num address= 0xc042010098
num = 10
(2)指针内存布局示意图
以上示意图执行到 ptr = &num,接下来“*ptr = 10”中的“ptr”取 num 变量的地址,“*”表示取 num 的值,“= 10”则将 num 的值由9修改为10,故最终输出值为10。
二、课堂练习
(1)第一题
func main() {
var a int = 300
var ptr *int = a
}
解析:
var ptr *int = a 错误,a 是一个值,而 ptr 是一个指针变量,将值交给指针变量,是错误的,应改为 var ptr *int = &a。
(2)第二题
func main() {
var a int = 300
var ptr *float = &a
}
解析:
var ptr *float = &a 错误,将地址交给指针时也要求类型一致,a 是 int 变量,而指针 ptr 指向的是 float32,将 int型变量 a 的地址交给 float32型指针,指向 float32的指针变量接收地址必须是 float32型变量的地址。
(3)第三题
func main() {
var a int = 300
var b int = 400
var ptr *int =&a
*ptr = 100
ptr = &b
*ptr = 200
fmt.Printf("a=%d,b=%d,*ptr=%d",a,b,*ptr)
}
Q:该代码输出什么内容?
解析:var a int = 300表示将300赋值给 a
var b int = 400表示将400赋值给 b
var ptr *int =&a 表示将 int 型变量 a 的地址交给指向 int 的指针 ptr
*ptr = 100表示取指针 ptr 的地址,并将该地址下存储的值改为100,即将 a 的值改为了100
ptr = &b 表示将 int 型变量 b 的地址交给 ptr,此时指针 ptr 改为指向 in t型变量 b 的地址
*ptr = 200表示取指针 ptr 的地址,并将该地址下存储的值改为200,即将 b 的值改为了200,a 不变
fmt.Printf("a=%d,b=%d,*ptr=%d",a,b,*ptr)表示分别输出 a、b 以及 ptr 所指向的变量 b 的值
因此,最终的输出结果为 a = 100,b = 200,*ptr = 200。
三、指针的使用细节
(1)值类型
所有的值类型都有对应的指针类型,形式为*数据类型。
如 int 对应的指针类型为*int,float32对应的指针类型解释*float32,float64对应的指针类型解释*float64。
(2)值类型分类
基本数据类型 int 系列、floa t系列、bool、string、数组和结构体 struct(后面会讲到)