go指针

作者: BridgeXD | 来源:发表于2019-04-03 08:10 被阅读0次

    定义

    &变量 取地址操作 引用运算符

    *指针变量 取值操作 解引用运算符

    a := 10
    fmt.Printf("%p\n", &a)
    
    //定义指针变量存储变量的地址
    var p *int = &a
    fmt.Printf("%p\n", p)
    
    *p = 123
    fmt.Println(*p)
    
       结果: 0xc00000a0a8
        0xc00000a0a8
        123
    
    
    //声明指针变量 默认值为0x0(nil)
    //内存地址编号为0,0~255的空间为系统占用 不允许用户访问
    var p *int = nil
    fmt.Printf("%p\n", p)
    fmt.Println(p)
    
    p = new(int)
     //new(数据类型) 开辟数据类型对应的内存空间,返回值为数据类型指针
    fmt.Println(*p)
    *p = 123
    fmt.Println(*p)
    

    指针变量必须有一个合理的指向(空/野指针)

    • 所有的指针类型都存储的是一个无符号十六进制整型数据

      a := 10
      //通过自动推导创建指针变量
      p := &a
      fmt.Printf("%T\n", p) //自动推导类型创建指针变量
          *int
      

    指针作为函数参数

    值传递 形参不改变实参的值

    地址传递 形参可以改变实参的值

    a := 10
    b := 30
        //swap(a,b)//值传递 形参不改变实参的值
    //地址传递 形参可以改变实参的值
    swapPpp(&a, &b)
    fmt.Println(a, b)    
    
    func swapPpp(a *int, b *int) {
        tmp := *a
        *a = *b
        *b = tmp
    }
    30,10
    
    • 指针变量和存储的数据类型需要相同类型

      arr:=[3]int{1,2,3}
      var p *[10]int=&arr//错误
      
    • 数组指针

       var p *[10]int
      
    • 指针数组

      var arr [10]*int
      
    • 结构体指针

    func studyPppStruct() {
    var per Person = Person{1, "da", 23, "男", "sw"}
    var p *Person = &per
    //通过指针间接修改结构体成员的值
    (*p).address = "re"
    p.name = "we"
    //指针可以直接修改结构体成员
    fmt.Println(per)
    testPppStruct(&per)
    fmt.Println(per)
    }
    
    func testPppStruct(p *Person) {
      p.sex = "女"
    }
    
    {1 we 23 男 re}
    {1 we 23 女 re}
    
    • 结构体数组指针

        arr := [3]Person{Person{1, "da", 23, "男", "sw"},
        Person{1, "we", 23, "男", "re"},
        Person{1, "we", 23, "女", "re"},
      }
      p := &arr
      fmt.Printf("%p\n", p)
      p[0].age = 32
      (*p)[0].sex = "nv"
      
      for i := 0; i < len(p); i++ {
        fmt.Println(p[i])
      }
      

    相关文章

      网友评论

          本文标题:go指针

          本文链接:https://www.haomeiwen.com/subject/khebbqtx.html