2

在 Java 中,当我这样做时

Foo bar = new Foo();

bar 将是一个包含新构造对象地址的变量。我的教授称它为参考变量

上一行在 C++ 中等价于:

Foo *bar = new Foo();

这里,bar 是指向对象的指针

那么,Java 中的引用变量是否基本上是一个指针?

此外,当我在 C++ 中执行此操作时:

Foo bar;

bar也是指针吗?如果不是,那么这是否意味着两者之间的内存结构存在差异

Foo bar;

Foo *bar = new Foo();

?

4

7 回答 7

8

C++ 中的指针的行为类似于 Java 中的引用。

然而,Foo bar;Foo *bar = new Foo();. 第一个创建具有自动持续时间的 Foo 实例。它将在创建它的块的末尾被销毁。第二个创建动态分配的 Foo 实例。它会一直存在,直到被明确删除。

如果您希望对象在函数返回后存在,则不能使用第一个。如果在函数返回后使用指针或对它的引用,就会发生不好的事情。在这种情况下,您必须使用第二种形式。

第一种形式的优点是您不必担心内存管理。它将在其作用域结束时自动销毁。对于第二种形式,您必须手动删除它,或者使用某种智能指针对其进行管理。

于 2012-10-17T18:45:42.863 回答
3

那么,Java 中的引用变量是否基本上是一个指针?

--> 总之是!但是由于 c++ 允许您操作指针,java 不允许。(相似是区分的好词)

Foo bar; // bar is allocated on stack in c++

--> 在 java 中,这只是bar类型的声明Foo

Inc++对象可以被保存,stack也可以heapJava对象被存储only on heap时被保存,而指向对象的对象引用在堆栈上。

Foo *bar = new Foo(); // C++ : *bar 在堆栈上,而分配的内存在堆上

Foo bar = new Foo(); // Java : 栈上的 bar 和使用 new 创建的对象在堆上

于 2012-10-17T18:42:29.733 回答
3

如果您想知道“指针”一词是否适用于每种语言,给定每种语言的规范,那么的。

Java 语言规范中,Java 引用被称为“指针”:

对象实例或数组

引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它不引用任何对象。

在 C++ 语言规范(这是一个国际 ISO 标准,C++ 标准)中,C++ 指针被称为“指针”。

于 2012-10-17T18:44:05.563 回答
1

此外,当我在 C++ 中执行此操作时:

富吧;bar也是指针吗?如果不是,那么这是否意味着两者之间的内存结构存在差异

富吧;

它不是指针。它只是在堆栈上创建的一个对象。

在 Java 中,所有对象都是引用或指针,或者使用返回地址 new C++ 指针和 Java“指针”之间的区别在于,您不能在 Java 中进行指针运算。

上次我阅读 Java 编程语言时,它说引用指针。

于 2012-10-17T18:44:10.603 回答
1

好吧,如果你想挑剔的话,它们实际上并不完全像指针:

  1. Java 指针不允许使用指针算术。您不能递增、递减、乘以等指针来移动它们在内存中指向的内容。
  2. 不是强类型。在 C 中,您可以将指针从一种类型转换为几乎任何类型,而不会产生任何后果(只要您小心)。在 Java 中,如果您尝试在不兼容的类型之间进行转换,您将得到一个异常。

否则,它们的行为方式与指针几乎相同,只要您不需要 C 样式指针的上述任何特性,您可能不会注意到差异。

于 2012-10-17T18:48:32.043 回答
1

指针是表示内存地址的值。
引用是引用对象的值。
指针是实现引用的一种方式。其实使用指针实现引用有多种方式,因为大多数对象占用不止一个地址,所以你要定义引用指向哪个地址。

几个区别:

  • 您可以使用指针进行数学运算,因为地址是整数值。参考值没有内在意义,它只是代表一个对象。
  • 指针可以指向任何值,例如对象中的字段;引用始终代表整个对象。
于 2012-10-17T19:15:56.310 回答
0

将它们与 Pascal 指针进行比较会更准确。它们有许多相同的特征:强类型、没有算术、可以为空。

于 2012-10-17T23:07:23.210 回答