go基础7-指针
https://geekr.dev/posts/go-pointer-usage
unsafe.Pointer
指针简介
变量的本质是对一块内存空间的命名 指针则是用来指向这些变量值所在的 内存地址的值
a:=100
var ptr *int
ptr = &a
fmt.Println(ptr)//内存地址
fmt.Println(*ptr)// 100 值
使用场景
1 类型指针 2 切片
指针类型的声明和初始化
var ptr *int
a:=100
ptr = &a
当指针被声明以后 没有任何变量指向内存地址是 他的零值是nil 然后我们通过 & 获取该变量对应的内存地址 再将其赋值声明的指针类型 完成对指针的初始化
通过 * 变量名 获取指针指向内存空间存的变量值
也可以是用 := 对指针完成初始化
a := 100p
ptr := &a
%p, %d %p来表示指针类型
fmt.Printf("%p",ptr)
fmt.Printf("%d",*ptr)
还可以通过 new 声明指针
ptr := new(int)
*ptr = 100
通过指针传值
func swap(a,b int){
a,b = b,a
fmt.Println(a,b)
}
func main(){
a:=1
b:=2
swap(a,b)
fmt.Println(a,b)
}
func swap(a,b *int){
*a,*b = *b,*a
fmt.Println(*a,*b)
}
func main(){
a:=1
b:=2
swap(&a,&b)
fmt.Println(a,b)
}
unsafe.Pointer
特别定义的一种指针类型
可以包含任意类型变量的地址
Go 语言中的类型指针不能进行偏移和运算,因此更为安全 但是unsafe.Pointer可以
任何类型 的指针都可以转换成unsafe.Pointer
unsafe.Pointer可以转换为任何类型的指针
uintptr 是可用于存储指针的整型
指针类型转换
i :=10
var p *int = &i
var fp *float32 = (*float32)(unsafe.Pointer(p))
*fp = *fp * 10
fmt.Println(i) //100
指针运算实现
arr := [3]int{1,2,3}
ap:=&arr
sp := *int (unsafe.Pointer(uintprt(unsafe.Pointer(ap)) +unsafe.Szieof(arr[0])))
*sp +=3
fmt.Println(arr) 数组元素偏移量 unsafe.Sizeof()
[1 5 3]

浙公网安备 33010602011771号