指针
2022-02-05 大约 2 分钟
# 什么是指针
一个指针变量指向了一个值的内存地址。
go语言中使用指针前你需要声明指针。指针声明格式如下:
var var_name *var-type
// 声明一个变量是ptr,类型为指针类型
var ptr *int
1
2
3
4
2
3
4
var-type 为指针类型
*
号用于指定变量是作为一个指针类型var_name 为指针变量名
# 使用指针
指针使用流程:
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量。
package main
import "fmt"
func main() {
var age int = 18
// &符号+变量 就可以获取这个变量内存的地址
fmt.Println(&age)
// 定义一个指针变量
// var 表示声明一个变量
// ptr 指针变量的名字
// ptr 对应的类型是:*int 是一个指针类型,(可以理解为指向int类型的指针)
var ptr *int = &age
fmt.Println(ptr)
fmt.Println("ptr本身这个存储空间的地址为:", &ptr)
// 想获取ptr这个指针或者这个地址指向的那个数据
fmt.Printf("ptr指向的数值为:%v", *ptr)
}
// 打印结果
// 0xc0000120a8
// 0xc0000120a8
// ptr本身这个存储空间的地址为: 0xc000006030
// ptr指向的数值为:18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
相关信息
最重要的两个符号:
- & 取内存地址
*
根据地址取值
# 四个细节
可以通过指针改变变量的值。
func main() { var age int = 18 fmt.Println(age) // 18 var ptr *int = &age *ptr = 20 fmt.Println(age) // 20 }
1
2
3
4
5
6
7
8指针变量接收的一定是地址值。
func main() { var age int = 18 // 如果把 & 符号去掉,则会编译错误 // cannot use age (type int) as type *int in assignment var ptr *int = age *ptr = 20 }
1
2
3
4
5
6
7指针变量的地址不可以匹配。
func main() { var age int = 18 // 此处如果把 *int 改为 *float 则会编译错误 // cannot use &age (type *int) as type *float64 in assignment var ptr *float64 = &age *ptr = 20 }
1
2
3
4
5
6
7因为*float64意味着这个指针指向的是float32类型的数据,但是&age对应的是Int类型的。
基本数据类型(又叫值类型),都有对应的指针类型,形式为*数据类型。
func main() { var ptr1 *int var ptr2 *string var ptr3 *byte ... }
1
2
3
4
5
6