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. 今日又遇无法启动apache

    前几天安装了.NET要用到的MSSERVER,之后apache就running none of service. 把微软的MSSERVER停用掉服务就没问题.哪部分冲突了

  2. 模板引擎 Velocity

    模板引擎 Velocity 一.Velocity简介: Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template langu ...

  3. Android_adb使用

    Android Debug Bridge version 1.0.26 - #当升级 Android SDK 后,ADB 也会随之升级. adb [-d|-e|-s {<serialNumber ...

  4. devm_kzalloc and kmalloc

    Move resources allocated using unmanaged interface to managed devm interface So today let's talk abo ...

  5. myeclipes使用过程中的错误解决方案

    1.‘Building workspace’ has encountered a problem. Errors occurred during the build. 解决方案:这样的错误,主要是由于 ...

  6. rnqoj-99-配置魔药-dp

    比较好的题目~~ dp[j][k]: 第一个容器在第i秒和第二个容器在第j秒,所产生的最大魔力. if(num[i].t2<=j)dp[j][k]=max(dp[j][k],dp[num[i]. ...

  7. Java JDBC批处理插入数据操作(转)

    在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及 ...

  8. hadoop错误java.io.IOException Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try

    错误: java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more go ...

  9. 基于heartbeat的单播方式实现tomcat高可用

    1.节点规划 在master.backup节点上添加eth0.eth1两网卡,具体添加过程,参考“基于VMware为CentOS 6.5配置两个网卡” 2.IP规划   master backup e ...

  10. android智能天气闹钟应用开发经过

    开发这个应用的初衷是这样产生滴,和我一块租房的同学每天早上都是骑单车上班,所以手机闹钟就会定一个刚好适合骑车的起床时间点.但是呢,有一天早上起床以后发现外面下挺大雨,肯定是不能骑车去上班了,于是就只好 ...