• go语法:多重指针**


    参考

    https://blog.csdn.net/OldDriver1995/article/details/100550224

    基本概念和关系

    1,指针变量也是变量也有自己的内存地址,指针变量的值为另一个变量的地址

    2,指针变量类型前面需要*,指针变量的值为&另一个变量(可以是指针变量)

    3,&为取址运算符,只能放在变量(可以是指针变量和接口变量)前,不能放在地址前;*为取值运算符,只能放在指针变量前面(不能是接口变量)获取地址对应的变量的值(该值仍可能是内存地址,所以可以多重取值**..)

    4,接口,类型(数据类型),变量(类型变量,指针变量,接口变量),值(数据或地址),指针的关系;指针是一种特殊的变量,并且指针类型需要指定具体的值类型(地址对应值的类型,不能是接口类型)

    5,指针也是变量,不能直接在;&只能放在非匿名变量前使用,不能放在值前面不支持多重&&;

    6,一个变量的值到底是另一个指针变量还是普通值(只可能为这两种),取决于该变量类型是否为多层指针类型。只有指针才有这种特性;

    7,不管是几层指针类型,指针变量的值都是地址而已,最后都要依托于普通变量的类型,只是多了一些映射关系

    代码

    func ptr1()  {
        var a int = 5
        var ptr1 *int
        ptr1 = &a
        fmt.Println(ptr1,*ptr1)
    }
    
    func ptr2()  {
        var a int = 5
        var ptr1 *int
        ptr1 = &a
    
        var ptr2 **int
        ptr2 = &ptr1
        fmt.Println(ptr2,*ptr2,**ptr2,ptr1,*ptr1)
    }
    
    func ptr3()  {
        var a int = 5
        var ptr1 *int
        ptr1 = &a
    
        var ptr2 **int
        ptr2 = &ptr1
    
        var ptr3 ***int
        ptr3 = &ptr2
        fmt.Println(ptr3,*ptr3,**ptr3,***ptr3,ptr2,*ptr2,**ptr2) //多层指针变量可以多重取值
        fmt.Println(&ptr2,&ptr1,&a)//不能多层取址,因为地址已经是值
        fmt.Println(&a,*ptr2) //相等
        fmt.Println(&ptr1,*ptr3)//相等
    }
    
    结果:
    0xc00000a0a8 5
    0xc000006030 0xc00000a0e0 5 0xc00000a0e0 5
    0xc000006040 0xc000006038 0xc00000a0e8 5 0xc000006038 0xc00000a0e8 5
    0xc000006040 0xc000006038 0xc00000a0e8 5
    0xc00000a0e8 0xc00000a0e8
    0xc000006038 0xc000006038
  • 相关阅读:
    链接的思考
    反向传播算法为什么要“反向”
    浅说机器学习理论
    体验一下5分钟快速迁移mysql近亿数据量大表的速度!!!
    (MHA+MYSQL-5.7增强半同步)高可用架构设计与实现
    MySQL-开发规范升级版
    Mysql 优化建议
    Percona XtraDB Cluster(PXC)-高可用架构设计说明
    企业级-Mysql双主互备高可用负载均衡架构(基于GTID主从复制模式)(原创)
    记一次测试环境下PXC集群问题《经验总结》
  • 原文地址:https://www.cnblogs.com/tkzc2013/p/15218045.html
Copyright © 2020-2023  润新知