zoukankan      html  css  js  c++  java
  • Golang数据类型之指针

    1、概述

    每个变量在内存中都有对应的存储位置,也就是内存地址

    指针类型是指变量存储的是一个内存地址的变量类型,在golang中可以通过&运算符获取变量的指针

    取变量指针的语法

    ptr := &v    // v的类型为T
    // v:代表被取地址的变量,类型为T
    // ptr:用于接收地址的变量,ptr的类型就为*T,称做T的指针类型。*代表指针
    

    2、声明

    指针声明需要指定存储地址中对应数据的类型,并使用*作为类型前缀进行指针取值

    func main() {
        //指针取值
        a := 10
        b := &a // 取变量a的地址,将指针保存到b中
        fmt.Printf("type of b:%T
    ", b)
        c := *b // 指针取值(根据指针去内存取值)
        fmt.Printf("type of c:%T
    ", c)
        fmt.Printf("value of c:%v
    ", c)
    }
    /*
    type of b:*int
    type of c:int
    value of c:10
    /*
    

    用法归纳

    • 对变量进行取地址(&)操作,可以获得这个变量的指针变量
    • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值
    • 指针变量的值是变量的内存地址

    3、空指针

    指针变量声明后会被初始化为nil,表示的是空指针

    func main() {
        var p *string
        fmt.Println(p)
        fmt.Printf("p的值是%v
    ", p)
        if p != nil {
            fmt.Println("非空")
        } else {
            fmt.Println("空值")
        }
    }
    

    还可以使用new函数进行初始化,new函数会根据数据类型申请内存空间并使用零值填充,并返回申请的空间地址

    var a *int = new(int)
    fmt.Println(&a)
    fmt.Println(a) // 0xc000014330
    fmt.Println(*a) // 0
    // 变量的地址 指针的地址 指针的值
    

    4、用指针修改值

    exchange函数依次进行的操作:

    • c指针的值, 赋给临时变量t

    • d指针的值, 赋给c指针指向的变量

    • c指针的值赋给d指针指向的变量

    func exchange(c, d *int) {
    	t := *c
    	*c = *d
    	*d = t
    }
    func main() {
    	a, b := 6, 8      // 准备两个变量, 赋值6和8
    	exchange(&a, &b)  // 交换变量值
    	fmt.Println(a, b) // 输出变量值
    }
    /*
    8 6
    */
    

    5、指针的指针

    用来存储指针变量地址的变量叫做指针的指针

    func main() {
       var a int
       var ptr *int
       var pptr **int
       a = 3000
       /* 指针 ptr 地址 */
       ptr = &a
       /* 指向指针 ptr 地址 */
       pptr = &ptr
       /* 获取 pptr 的值 */
       fmt.Printf("变量 a = %d
    ", a )
       fmt.Printf("指针变量 *ptr = %d
    ", *ptr )
       fmt.Printf("指向指针的指针变量 **pptr = %d
    ", **pptr)
    }
    /*
    变量 a = 3000
    指针变量 *ptr = 3000
    指向指针的指针变量 **pptr = 3000
    /*
    

    多维指针

    func main() {
    		var a ****int
        v := 10
        p1 := &v  // *int
        p2 := &p1 // **int
        p3 := &p2 // ***int
        a = &p3   //  ****int
        fmt.Println(v, p1, p2, p3, a, ****a) // 10 0xc000114168 0xc00011e028 0xc00011e030 0xc00011e038 10
    }
    

    See you ~

  • 相关阅读:
    go语言从零学起(三) -- chat实现的思考
    go语言从零学起(二)--list循环删除元素(转载)
    go语言从零学起(一) -- 文档教程篇
    Spring框架事务支持模型的优势
    Thymeleaf
    社保到底是多交好,还是少交好?
    使用静态工厂方法而不是构造器
    EJB、RMI、XMLRPC、Hessian、Thrift 、Protobuf
    MySQL存储过程
    MySQL常用功能语句分类总结
  • 原文地址:https://www.cnblogs.com/ssgeek/p/15096916.html
Copyright © 2011-2022 走看看