为了账号安全,请及时绑定邮箱和手机立即绑定

Go(4[指针,Map])

标签:
Go

Go指针

指针类型

  1. 普通类型,变量存的就是值,也就是值类型.指针类型存的是地址

  2. 获取变量的地址,用&, 比如 a:=6 获取a的地址:&a

  3. 指针类型,变量存的是一个地址,这个地址存的才是值!!

  4. 获取指针类型所指向的值,使用:* ,比如: var *p int ,使用*p获取p所向的值

  5. 指针初始化:默认值为nil

    1. 指针类型变量初始化:

      1. 使用其他变量地址给它赋值

      2. 使用new分配:用来分配内存,主要⽤来分配值类型,⽐如int、 struct。返回的是指针

  6. 语句块内的变量,用完即销毁


测试一:传入一个int类型指针,并在函数中修改所指向的值

func test1(a *int)  {   //* 是一个语法糖, *a 就是修改指针值   *a = 100}func main()  {    var a int =1    //声明b是一个指针类型    var b *int    //& 是一个语法糖, & 就是变量内存地址    //赋值b指针指向a的地址    b = &a        test1(b)    fmt.Printf("%p,%d\n",b,a)}

测试二:使用new创建指针

func test2()  {   //c 指针初始化:默认值为nil   // var c *int   //直接赋值指针会出错   //*c = 200   //出错!!   //fmt.Println(c)   ///p 默认初始化nil   var p *int   var b int   p = &b   *p = 200 //b = 200   if (p == &b) {      fmt.Printf("equal\n")   }   fmt.Printf("%p %p %p\n", p, &b, &p)   p = new(int)   *p = 1000   fmt.Printf("%d\n", *p)   fmt.Printf("%p %p %p\n", p, &b, &p)   if (p == &b) {      fmt.Printf("equal")   }   //指针类型的变量初始化:1. 使用其他变量地址给它赋值。 2. 使用new分配}

测试三:使用指针修改字符串

func test3()  {   //指针字符串修改   var p *string   //第一种方式   p = new(string)   *p="abc"   fmt.Println("test3_1\n",*p)      //第二种方式   var str string = "hello word"   p = &str   fmt.Println("test3_2\n",p,*p)}

测试四:使用指针修改切片

func test5()  {   //指针切片修改    fmt.Println("\n",a)   //在make创建切片,创建后默认都是0   a := make([]int,10)   //给第0个元素赋值   a[0] = 100   fmt.Println("\n",a)   //指针指向切片:默认是nil   //p 是一个指针变量,有自己的内存地址,它的指针变量地址不会改变   ////方法一:   //声明p为一个指针   var p *[]int   fmt.Println("\n",p,&p)   //然后使用new 创建指针   p = new([]int)   fmt.Println("\n",p,*p) //输出一个 &[] 的值,就是指向切片   //make创建一个切片,并指向p指针   (*p) = make([]int,10)   //修改第0个元素   (*p)[0] = 100   fmt.Println(p)   //方法二   //& 是一个语法糖, & 就是变量内存地址   //直接指针赋值到&a的内存地址 a是切片   p = &a   (*p) [0] = 1000   fmt.Println(a)}

测试五:使用指针修改元组

//*[5]int 就是指针类型//修改元组内数据func test2(a *[5]int)  {   a[0] = 1000}//函数的传参就是。数据的copy!!!,因为内存地址都不一样, 但是传递指针,或者切片内存地址就一样//内存地址都是不一样!func test1(a [5]int)  {   a[0] = 1000   fmt.Printf("test1:%p\n",&a)}func main()  {   var a [5]int=[5]int{1,3,4,5}   //&a 就是把a的内存地址传递过去   test2(&a)   test1(a)   fmt.Printf("test1-2:%p\n",&a)   fmt.Println(a)}

总结:

  1. 指针默认 var p *int 内容都是nil,需要new创建指针

    1. 创建字符串的指针 写法: p:=new(string)   注:省去var 定义了

    2. 创建切片的指针 写法 p:=new([]int)

  2. var p *string  p是一个指针变量,有自己的内存地址,它的指针变量地址不会改变



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消