2

Javaでは、私がするとき

Foo bar = new Foo();

bar は、新しく構築されたオブジェクトのアドレスを含む変数になります。私の教授はそれを参照変数と呼んでいます

前の行は、C++ の次の行と同等です。

Foo *bar = new Foo();

ここで、bar はオブジェクトへのポインタです

では、Java の参照変数は基本的にポインターであるというのは本当ですか?

また、C++ でこれを行うと、次のようになります。

Foo bar;

バーもポインタですか?そうでない場合、それはメモリ構造に違いがあることを意味しますか

Foo bar;

Foo *bar = new Foo();

?

4

7 に答える 7

8

C ++のポインタは、Javaの参照と同様に動作します。

ただし、Foo bar;とは大きく異なりFoo *bar = new Foo();ます。1つ目は、自動期間でFooのインスタンスを作成します。作成されたブロックの最後で破棄されます。2つ目は、動的に割り当てられたFooのインスタンスを作成します。明示的に削除されるまで残ります。

関数が戻った後にオブジェクトを存在させたい場合は、最初のものは使用できません。関数が戻った後にポインタまたはそれへの参照を使用すると、悪いことが起こります。そのような状況では、2番目のフォームを使用する必要があります。

最初の形式の利点は、メモリ管理について心配する必要がないことです。スコープの最後で自動的に破棄されます。2番目のフォームでは、手動で削除するか、何らかのスマートポインターを使用して管理する必要があります。

于 2012-10-17T18:45:42.863 に答える
3

では、Java の参照変数は基本的にポインターであるというのは本当ですか?

--> 要するにYES! しかし、C++ ではポインターを操作できるため、Java ではできません。(類似は区別するのに良い言葉です)

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

--> Java では、これはただbarの型の宣言ですFoo

オブジェクトを指しているオブジェクト参照がスタックにある間、inオブジェクトはonと同様c++に保存できます。stackheapJavaonly on heap

Foo *bar = new Foo(); // C++ : *bar はスタック上にあり、割り当てられたメモリはヒープ上にあります

Foo バー = new Foo(); // Java : スタック上のバ​​ーと new を使用して作成されたオブジェクトはヒープ上にあります

于 2012-10-17T18:42:29.733 に答える
3

各言語の仕様を考えると、「ポインター」という用語が各言語に適しているかどうか疑問に思っている場合は、はい.

Java 言語仕様では、Java 参照は「ポインター」と呼ばれます。

オブジェクトクラス インスタンスまたは配列です。

参照値 (多くの場合、参照のみ) は、これらのオブジェクトへのポインターであり、オブジェクトを参照しない特別な null 参照です。

C++ 言語仕様 (国際的な ISO 標準であるC++ 標準) では、C++ ポインターは「ポインター」と呼ばれます。

于 2012-10-17T18:44:05.563 に答える
1

まあ、あなたがうるさくなりたいのなら、それらは実際にはポインタとまったく同じではありません:

  1. Javaポインタでは、ポインタ演算は許可されていません。ポインタをインクリメント、デクリメント、乗算などして、それらが指すものをメモリ内で移動することはできません。
  2. 強くタイプされていません。Cでは、あるタイプからほとんどすべてのタイプにポインターをキャストできますが、結果はありません(注意している限り)。Javaでは、互換性のないタイプ間でキャストしようとすると例外が発生します。

それ以外の点では、ポインターとほぼ同じように動作し、Cスタイルのポインターの上記の機能のいずれも必要ない限り、おそらく違いに気付くことはありません。

于 2012-10-17T18:48:32.043 に答える
1

ポインタは、メモリアドレスを表す値です。
参照は、オブジェクトを参照する値です。
ポインターは、参照を実現する 1 つの方法です。実際、ポインタを使用して参照を実現する方法はいくつかあります。ほとんどのオブジェクトは複数のアドレスを使用するため、参照ポイントのアドレスを定義する必要があります。

いくつかの違い:

  • アドレスは整数値であるため、ポインターを使用して計算を行うことができます。参照値には固有の意味はなく、オブジェクトを表すだけです。
  • ポインターは、オブジェクト内のフィールドなど、任意の値を指すことができます。参照は常にオブジェクト全体を表します。
于 2012-10-17T19:15:56.310 に答える
1

また、C++ でこれを行うと、次のようになります。

フーバー; バーもポインタですか?そうでない場合、それはメモリ構造に違いがあることを意味しますか

フーバー;

ポインターではありません。スタック上に作成された単なるオブジェクトです。

Java では、すべてのオブジェクトが参照またはポインターであるか、 new C++ ポインターと Java の "ポインター" の違いは、Java ではポインター演算を使用できないことです。

前回、Java プログラミング言語を読んだとき、参照ポインターであると書かれていました。

于 2012-10-17T18:44:10.603 に答える
0

それらを Pascal ポインターと比較する方が正確です。それらには、同じ特性の多くがあります。厳密に型指定されている、算術演算がない、null になる可能性があります。

于 2012-10-17T23:07:23.210 に答える