Go指针(一)

作者: 草莓君_ | 来源:发表于2019-07-30 20:28 被阅读0次

    很多小伙伴将内存和指针混为一谈。你是不是也是呢?
    内存地址是内存中每个字节单元的唯一编号,而指针则是一个实体。指针会分配内存空间,相当于一个专门用来保存地址的整形变量。

    • 取值运算符 & 用于获取对象地址
    • 指针运算符 * 用于间接引用目标对象
    • 二级指针**T,如包含包名则写成*package.T

    1.指针运算符为左值时,我们可以更新目标对象的状态;而为右值时则是为了获取目标的状态。

    func main() {
        x := 10
        var p *int = &x  //获取地址,保存到指针变量
        *p += 20        //用指针间接引用,并跟新对象
        println(p, *p)  //输出指针所存储的地址,以及目标对象
    }
    

    输出:

    0xc000040780 30
    

    2.指针类型支持相等运算符,但不能做加减运算和类型转换。如果两个指针指向同一地址,或都为nil,那么它们相等。

    func main() {
        x := 10
        p := &x
    
        p++   //编译报错 invalid operation: p++ (non-numeric type *int)
        var p2 *int = p+1  //invalid operation: p + 1 (mismatched types *int and int)
        p2 = &x
        println(p == p2)   //指向同一地址
    }
    

    可通过unsafe.Pointer将指针转换为uintptr后进行加减法运算,但可能会造成非法访问。

    相关文章

      网友评论

        本文标题:Go指针(一)

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