zoukankan      html  css  js  c++  java
  • Golang指针

    学过C语言的老司机都知道,指针就是一个变量,用于存储另一个变量的内存地址。

    那么什么是变量呢?在现代计算机体系结构中所有的需要执行的信息代码都需要存储在内存中,为了管理存储在内存的数据,内存是划分为不同的区域的,不同区域都用内存地址来标识。一个典型的内存地址是个16进制的8位数(一个字节)比如0xAFFFF(这是一个内存地址的十六进制表示)。

    要访问数据,我们需要知道它的存储地址。我们可以跟踪存储与我们的程序相关的数据的所有内存地址。但是要记住这些内存地址,非常费劲,怎么办呢?

    于是我们引入了变量的概念。变量只是给存储数据的内存地址的好记得别名。指针也是一个变量。但它是一种特殊的变量,因为它存储的数据不仅仅是一个普通的值,如简单的整数或字符串,而是另一个变量的内存地址。

    在上面的图中,指针p包含变量a的地址值0x0001。

    package main
    
    import "fmt"
    
    func main() {
    
        var p *int
    
        fmt.Println("p = ", p)
    
    }
    
    # Output
    
    p = <nil>

    指针声明

    T类型的指针使用以下语法声明:

    //类型T的指针

    var p *T

    类型T是指针指向的变量的类型。比如整型指针:

    //类型为整型指针

    var p *int

    p指针只能保存int变量的内存地址。

    指针的零值,不是0,而是nil。任何未初始化的指针值都为nil。我们直接撸一个代码:

    package main
    
    import "fmt"
    
    func main() {
    
    var p *int
    
    fmt.Println("chongchong p = ", p)
    
    }
    
    
    #Output
    
    chongchong p = <nil>

    初始化指针

    初始化一个指针,只需给他赋予其他变量的内存地址接口。变量的地址可以使用使用&运算符获得:

    var x = 100

    var p *int = &x

    上面我们通过对x做&运算符来获取其地址,然后将该地址分配给指针p。

    就像Golang中的其他变量一样,编译器也会推断指针变量的类型。所以你可以在上面的例子中省略指针p中的类型声明,直接简写为:

    var p = &x

    撸代码之例2 :

    package main
    
    import "fmt"
    
    func main() {
    
    var a = 3.1415926
    
    var p = &a
    
    fmt.Println("chongchong value a = ", a)
    
    fmt.Println("chongchong Address a = ", &a)
    
    fmt.Println("chongchong value p = ", p)
    
    }

    输出结果

    chongchong value a = 3.1415926
    
    chongchong Address a = 0Xc82000a330
    
    chongchong value p = 0Xc82000a330

    指针解引用

    要获得指针指向地址的值,我们可以使用*运算符。这叫解引用。

    package main
    
    import "fmt"
    
    func main() {
    
    var a = 100
    
    var p = &a
    
    fmt.Println("chongchong a = ", a)
    
    fmt.Println("chongchong p = ", p)
    
    fmt.Println("chongchong *p = ", *p)
    
    }

    输出入下:

    chongchong a = 100
    
    chongchong p = 0Xc82000a330
    
    chongchong *p = 100

    通过*运算符不仅能取值,还可以对指向变量值做修改。以下示例通过指针p设置存储在变量a中的值:

    package main
    
    import "fmt"
    
    func main() {
    
        var a = 8888
    
        var p = &a
    
        fmt.Println("chongchong a = ", a)
    
        *p +=1112
    
        fmt.Println("chongchong a(altered)= ", a)
    
    }

    结果如下:

    chongchong a = 8888
    chongchong a(altered)= 10000

    多重指针

    指针可以指向任何类型的变量。所以也可以指向另一个指针。以下示例显示如何创建指向另一个指针的指针:

    package main
    
    import "fmt"
    
    func main() {
    
    var a = 3.141596
    
    var p = &a
    
    var pp = &p
    
    fmt.Println("a = ", a)
    
    fmt.Println("chong address a = ", &a)
    
    fmt.Println("p = ", p)
    
    fmt.Println("chongchong p = ", &p)
    
    fmt.Println("pp = ", pp)
    
    fmt.Println("chongchong *pp = ", *pp)
    
    fmt.Println("chongchong **pp = ", **pp)
    
    }

    结果输出为

    a = 3.1415926
    chong address a = 0Xc82000a330
    p = 0Xc82000a330
    chongchong p = 0Xc820030020
    pp =  0Xc820030020
    chongchong *pp=0Xc82000a330
    chongchong **pp =  3.1415926

    Go中没有指针算术

    老司机,都知道,可以在C/C ++中队指针做计算,但是golang就不支持那样做了。

    package main
    
    func main() {
    
    var x = 67
    
    var p = &x
    
    var p1 = p + 1 // Compiler Error: invalid operation
    
    }

    但是,golang中可以使用==运算符来比较两个相同类型的指针是否相等。

    包主要

    package main
    
    import "fmt"
    
    func main() {
    
    var a = 3014
    
    var p1 = &a
    
    var p2 = &a
    
    if p1 == p2 {
    
    fmt.Printf("chongchong p1(%x) = p2(%x) value(%d): 
    ",p1,p2,*p1)
    
    }
    
    }

    结果为:

    chongchong p1(c82000a330) = p2(c82000a330) value(3014)
  • 相关阅读:
    数据可视化之分析篇(三)Power BI总计行错误,这个技巧一定要掌握
    数据可视化之分析篇(二)Power BI 数据分析:客户购买频次分布
    数据可视化之分析篇(一)使用Power BI进行动态帕累托分析
    机器学习实战基础(三):创建线性回归器
    数据可视化实例(十五):有序条形图(matplotlib,pandas)
    scrapy 源码解析 (五):启动流程源码分析(五) Scraper刮取器
    4sum, 4sum closest
    3sum, 3sum closest
    两数之和-数据结构设计 · Two Sum
    (hash map)Two Sum, sorted(排序+双指针)closest,小于或大于的对数,组成不同的对数
  • 原文地址:https://www.cnblogs.com/richiewlq/p/10399893.html
Copyright © 2011-2022 走看看