前言
上次学习了golang的整形、浮点型、bool类型等基础数据类型和array、struts复合类型以及引用类型的slice、map。
本次学习指针类型
一、指针是什么?
想象一下你在放风筝,天空飞翔的风筝是数据而你手中的线就是数据的指针。风筝有各式各样的风筝,线也有各种各样的线。
二、指针的使用
和普通变量一样指针变量的使用也是三个步骤:
1、定义变量
2、为变量赋值
3、读取变量的值
手中直接抓着风筝线不大好,不然手会被磨秃噜皮。我们需要一个线盘,线盘有两个作用:
1、放线:放飞风筝手中拿着线盘,对应指针操作的取地址运算符(&)
2、收线:收回线可以拿到风筝,对应指针操作的取值运算符(*)
实例代码如下:
package main
func main() {
// 通过系统函数new 定义一个指针变量
i := new(int)
// 通过*获取指针的值,整形变量默认值0
println(*i)
var n int = 9
// 通过&获取到变量n的指针
var m = &n
// 打印指针的值即n地址
println(m)
// 打印指针指向的值
println(*m)
// 声明一个指针变量
var iptr *int
// 为iptr赋值,值为n的地址
iptr = &n
// 打印指针
println(iptr)
// 打印指针指向的值
println(*iptr)
// m是一个指针变量,mptr是指向m的指针
mptr := &m
println(mptr)
println(*mptr)
println(**mptr)
}
三、指针的三种分类
1、如上面示例中的类型
i := new(int)
mptr := &m
println(*i,*mptr)
2、unsafe.Pointer
3、uintptr 可进行指针地址的位移操作
四、三种类型的转换
package main
import (
"fmt"
"unsafe"
)
func main() {
s := make([]int, 10)
s[1] = 2
p := &s[0]
fmt.Println(*p)
// * ——> unsafe.Pointer ——> uintptr
up := uintptr(unsafe.Pointer(p))
// 指针位移至下一个单位地址
up += unsafe.Sizeof(int(0))
// uintptr ——> unsafe.Pointer ——> *
p2 := (*int)(unsafe.Pointer(up))
fmt.Println(p2)
fmt.Println(*p2)
}