2013-07-07 47 views
0

不管在指针引用提供了方便的,如解引用的无针和规则特定使用每个的,Go和C++中指针和引用之间的逻辑差异?

是有提供两个语言构造作为指针和引用的任何逻辑的原因或者是它只是一个语法糖?

(我猜的最终落脚点实现,作为与言下之意指针做/检查由语言的引用定义的规则,编译器将使用相同的步骤进行的引用。)

注:问题是不是规则的语言在参考定义,如“引用不允许在C分配NULL ++但指针”等

+0

在C++中,引用是对象的别名。它远远超出语法糖:它始终指向同一个对象,并且不支持指针算术。 – juanchopanza

+0

这听起来像一个有趣的问题,但我无法弄清楚你在问什么。 Go和C++如何发挥作用?你在寻找什么确切的“差异”?你能否澄清这个问题? –

+0

@Kerrek Go和C++已经包含了使问题具体化的问题,因此允许提供具体的答案。此外,两种语言对refs和pointers都有相同的语义。 – nish1013

回答

3

你问两个问题,如果我理解正确

  1. 是什么指针和引用
  2. 之间的差异为什么支持两种数据类型

这里所说:

  1. 的指针指的位置在内存中数据类型所在。指针的大小是固定的,给定底层硬件,通常是4或8个字节 - 完全不管它实际指向什么。此外,可以使用无效值将指针传递给函数 - foo(reintepret_cast<int *>(0xDEADBEEF));。 相比之下,引用可确保底层数据有效 - 因为引用是对象本身的别名,并且不能从此移动(假定引用的对象仍在范围内 - 每条注释编辑为 )。
  2. 还有支持这两种类型的原因。第一个原因是确保传递给函数的数据是有效的 - 不浪费测试指针有效性的周期(不是NULL)。第二个原因是可以肯定的是,不仅数据指向有效的位置,它还指向有效的数据对象。但主要原因是参考使我们能够享受调用函数的好处,而不需要按值传递参数,但仍保证参数指向有效值。
+0

@levngli。非常有建设性的答案,非常感谢。作为这个答案的一部分,你能否把'别名'概念作为回答,使这个答案更有价值。 – nish1013

+0

当然,别名的含义是引用指的是确切的对象。换句话说,如果在'bar' - 'rZog'和'foo'中有'int foo'这样的对象和一个带有'bar(int&rZog)'签名的函数,并且你调用了'bar(foo)''是相同的。分支之处在于''rZog'的变化在离开'bar'后会在'foo'中有效。应该将'bar'实现为void bar(int&rZog){rZog * = 2;}';一旦被调用,'foo'本身将被乘以2.“ – levengli

+1

”相比之下,引用确保底层数据有效“不正确。如果你有一个超出范围的变量的引用,它就不再有效。如果您通过该参考,它仍然无效。 – newacct

0

你应该问Bjarne Stroustrup为什么C++有引用。在其他地方,他提供了第7.7节“参考”,“C++编程语言”第四版中的基本原理。 The Design and Evolution of C++ 86。

+0

你能否在这里提供一个总结? – nish1013