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]

posted @ 2021-03-20 22:47  fly_fly_fly#  阅读(52)  评论(0)    收藏  举报