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

GO语言中的指针的更多相关文章

  1. C语言中的指针数组

    C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

  2. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

  3. C语言中的指针笔记

    C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...

  4. C语言中的指针加减偏移量

    C语言指针偏移技巧(也是一个要注意的坑) - 陈杰柱的博客 - CSDN博客  https://blog.csdn.net/cjzjolly/article/details/82116772 C语言中 ...

  5. C 语言中的指针和内存泄漏

    引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...

  6. C语言中的指针和内存泄漏

    引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...

  7. C语言中的指针学习(小黑板)

    指针是C语言中的精华所在,也是C语言的危险之在,今天又重现温习了一下C语言,做了一下总结. 欢迎批阅. (1)指针的含义指针的本质也是数据类型,它是指向地址的变量.例如: { int a = 10; ...

  8. [C]C语言中的指针和内存泄漏几种情况

    引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...

  9. 论C语言中二级指针和二维数组之间的区别

    刚开始学习C语言的时候,觉得一个数组可以定义一个一级指针去访问,想当然的就觉得可以定义一个二级指针去访问二维数组.很显然这是错误的. 我们来看看C语言的数组在内存中的存储方式. 实际上C语言中的数组, ...

随机推荐

  1. WPF button 圆角制作

    将以下节点复制到app.xaml的<Application.Resources>节点下 <Style TargetType="{x:Type Button}"&g ...

  2. Android-Wheel-Menu

    https://github.com/anupcowkur/Android-Wheel-Menu

  3. [TypeScript] Loading Compiled TypeScript Files in Browser with SystemJS

    TypeScript outputs JavaScript, but what are you supposed to do with it? This lesson shows how to tak ...

  4. Chapter 4 - How to Fire some Bullets

    Now, we want to let the hero fire some bullets to kill the enemies, add the codes below to set the l ...

  5. mysql 导入excel 或 .csv

    第一步 导出excel 去掉列头,设置文本里面格式

  6. Shell变量命名规则

    变量与变量内容以一个等号『=』来连结,如下所示: 『myname=chenfei0801』 等号两边不能直接接空格符,如下所示为错误: 『myname = chenfei0801』或『myname=c ...

  7. ubuntu 14.04/15.10 安装基于eclipse的android app开发环境

    一开始是装了ubuntu15.10,不知道是我的x200机器太old还是iso镜像有问题,总是各种莫名的引导不起来.有时候刚刚装好的干净系统,只install了一个vim和openssh,重启,然后就 ...

  8. RHEL7单独安装图形X11

    RHEL7 默认是最小化安装(Minimal Install),没有图形界面,我们应该选择Server with GUI.若已错过此步骤,我们采用以下方式补充安装GUI界面. # yum group ...

  9. java web 中的转发和重定向

    假设应用程序的 contextPath 为 /ctx,在 http://localhost:8080/ctx/a/b 资源中,我们转发和重定向到 http://localhost:8080/ctx/x ...

  10. order by跟group by 跟having----------------sum() 求和   avg()求平均   count() 求个数--------------like

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoEAAACdCAIAAABEujUmAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWX ...