zoukankan      html  css  js  c++  java
  • GO语言中的指针

    http://www.tizgrape.com/?p=100

    Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小。

    Go使用var定义变量:

    var v6 *int  // int* v6;  (but no pointer arithmetic)
    x = *p
    (*int)(nil)  // function pointer

    Go虽然有指针,但是没有指针算数,不能对其进行加减。但可以把指针值赋给另一个指针,因此Go的指针更像是C++的引用,却又没有C++中引用初始化后不能重新赋值的限制。

    Go使用nil来表示无效指针,C++使用NULL(0)nullptr(C++11)来表示空指针。

    当指向一个struct结构体时,Go的指针使用.而不是->来引用结构体的成员:

    type myStruct struct { i int }
    var v9 myStruct              // v9 has structure type
    var p9 *myStruct             // p9 is a pointer to a structure
    f(v9.i, p9.i)

    指针在Go中是“安全”的,指针无法指向任意的内存区域,缓冲区溢出的问题不会发生。但注意,解引用一个空指针同样能导致Go程序崩溃。

    指针的使用是和内存的分配紧密相关的。C&C++需要手动管理内存,然而Go使用垃圾收集器自动管理内存,这样就减少很多使用指针上的操心。首先我们再也不需要显示释放内存,悬挂指针(dangling pointer,指向已释放的内存)以及多次释放同一个指针指向内存的问题就不会发生。我们甚至不用担心内存是在栈上分配的还是堆上分配的。C++中的各种智能指针std::unique_ptr,std::shared_ptrstd::weak_ptrstd::auto_ptr也用不上了。一切都由Go的运行时系统帮助处理。

    在Go中,取一个变量的地址是安全的,不会产生悬挂指针。如果在程序中取了一个变量的地址,编译器会自动在栈上分配这个变量,下面的三个函数是等价的:

    type S { I int }
     
    func f1() *S {
            return new(S)
    }
     
    func f2() *S {
            var s S
            return &s
    }
     
    func f3() *S {
            // More idiomatic: use composite literal syntax.
            return &S{}
    }

    反之,在C++函数中,返回一个函数局部变量的指针是一个低级错误。

    // C++
    S* f2() {
      S s;
      return &s;   // INVALID -- contents can be overwritten at any time
    }

    参考:
    GoForCPPProgrammers

  • 相关阅读:
    深入浅出聊优化:从Draw Calls到GC
    关于Unity中植物树木烘焙后没有影子的解决方法
    Marvelous Designer 服装设计与模拟
    DAZ studio 4.9基础
    在下载SOPC代码的过程中遇到的一些错误
    开发工程师人生之路
    简易信号发生器的设计
    HDU A Simple Math Problem (矩阵快速幂)
    HDU Queuing (递推+矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/code-style/p/3770846.html
Copyright © 2011-2022 走看看