zoukankan      html  css  js  c++  java
  • 【原创】go语言学习(九)指针类型

    目录

    • 变量和内存地址
    • 指针类型
    • 值拷贝和引用拷贝

    变量和内存地址

    1、每个变量都有内存地址,可以说通过变量来操作对应大小的内存

    var a int32
    a = 100
    fmt.Printf(“%d
    ”, a)
    fmt.Printf(“%p
    ”, &a)
    

      注意:通过&符号可以获取变量的地址

    指针类型

    1、普通变量存储的是对应类型的值,这些类型就叫值类型

    var b int32
    b = 156
    fmt.Printf(“%d
    ”, b)
    fmt.Printf(“%p
    ”, &b)
    

      

     2、指针类型的变量存储的是一个地址,所以又叫指针类型或引用类型

    var b int32
    b = 156
    var a *int32
    a = &b
    

      

    3、指针类型定义,var 变量名 *类型

    package main
    import (
        "fmt"
    )
    func main() {
        b := 255
        var a *int = &b
        fmt.Printf("Type of a is %T
    ", a)
        fmt.Println("address of b is", a)
    }
    

      

    4、 指针类型变量的默认值为nil,也就是空地址

    package main
    import (
        "fmt"
    )
    func main() {
        a := 25
        var b *int
        if b == nil {
            fmt.Println("b is", b)
            b = &a
            fmt.Println("b after initialization is", b)
        }
    }
    

      

    5、如果操作指针变量量指向的地址⾥里里⾯面的值呢?

    package main
    import (
        "fmt"
    )
    func main() {
        b := 255
        a := &b
        fmt.Println("address of b is", a)
        fmt.Println("value of b is", *a)
    }
    

      注意:通过* 符号可以获取指针变量量指向的变量

    6、通过指针修改变量的值

    package main
    import (
      "fmt"
    )
    func main() {
      b := 255
      a := &b
      fmt.Println("address of b is", a)
      fmt.Println("value of b is", *a)
      *a++
      fmt.Println("new value of b is", b)
    }

    7、指针变量传参

    package main
    import (
        "fmt"
    )
    func change(val *int) {
        *val = 55
    }
    func main() {
        a := 58
        fmt.Println("value of a before function call is",a)
        b := &a
        change(b)
        fmt.Println("value of a after function call is", a)
    }
    

      

    8、 指针变量传参示例2

    package main
    import (
        "fmt"
    )
    func modify(arr *[3]int) {
        (*arr)[0] = 90
    }
    func main() {
        a := [3]int{89, 90, 91}
        modify(&a)
        fmt.Println(a)
    }
    

      

    9、切片传参

    package main
    import (
        "fmt"
    )
    func modify(sls []int) {
        sls[0] = 90
    }
    func main() {
        a := [3]int{89, 90, 91}
        modify(a[:])
        fmt.Println(a)
    }
    

      

    10、make用来分配引用类型的内存,比如 map、slice以及channel。new用来分配除引用类型的所有其他类型的内存,比如 int、数组等

    值拷贝和引用拷贝

    1、值拷贝和引⽤用拷贝

    a-->100 b-->100

    package main
    import (
        "fmt"
    )
    func main() {
        var a int = 100
        b := a
    }
    

      

     b --> a c--> a a--> 100

    package main
    import (
      "fmt"
    )
    func main() {
      var a int = 100
      var b *int = &a
      var c *int = b
      *c = 200
    }
    

      

  • 相关阅读:
    陶哲轩实分析习题17.1.4
    陶哲轩实分析习题17.1.4
    陶哲轩实分析习题17.1.2
    群给我的直观印象
    MYSQL数据丢失讨论
    提高大型软件项目质量的一些实用型技术分享
    再培养一个扎克伯克:六款适合儿童上手编程的App
    YouTube架构学习体会
    Web系统架构的一些思考
    备受开发者青睐的13款热门开源项目
  • 原文地址:https://www.cnblogs.com/wangshuyang/p/11800928.html
Copyright © 2011-2022 走看看