9

私はJava初心者です。C/C++ ポインターを Java 参照に変換する概念を理解することができ、これはかなりスムーズに進みました。

ポインターへのポインター (つまり、**ptr) を持つコードにヒットしました。ポインターを逆参照し、それが指しているポインターの値を変更する必要があります (つまり、*ptr = &newthing;)。

これはJavaではかなり難しいようです。この問題を解決する方法について誰かアイデアがありますか? クイックグーグル検索では何も見つかりませんでした。

C++ でのコード例を次に示します。Javaで同様の作業をしたいのですが、ptr_to_ptr変数が問題です:

struct _coord
{
   int x;
   int y;
   _coord * next_coordinate;
} coordinate_t;   

coordinate_t buffer[100];
coordinate_t * head;
coordinate_t ** ptr_to_ptr;

if (wednesday)
{
    ptr_to_ptr = &head;
}
else
{
    ptr_to_ptr = &head->next_coordinate;
}
*ptr_to_ptr = &buffer[3];   // <<<---- HOW DO YOU MAKE THIS WORK?
4

5 に答える 5

14

Java でポインターをポインターにモデル化するために使用できる典型的なトリックは、配列を使用することです。配列自体への参照は「ポインター」として機能し、配列要素はポイントされる項目として機能します。これらは好きなだけ入れ子にすることができますが、コードは C/C++ ほど見栄えがよくありません。

C/C++ のイディオムを Java に移植するのではなく、内部の項目を変更できる可変クラスを作成する必要があります。このクラスは、探している機能を提供する「ポインター」として機能し、Java コードを読みやすくします。ジェネリックはタスクを大幅に簡素化し、再利用できる実装を 1 つだけ必要とします。

于 2012-06-20T19:38:45.287 に答える
4

ポインターからポインターへのポインターは、Java では直接マップできません。関数内のポインターに新しいオブジェクトを割り当てたいとします。

私の知る限り、参照として機能するラッパーオブジェクトを使用することによってのみこれを解決できるため、内部の実際の参照を変更できます。

class ObjRef {

   public RealObj obj;

}

void modifyRef(ObjRef ref){

   ref.obj = new RealObj()

}

お役に立てれば

于 2012-06-20T19:49:47.557 に答える
3

私は自分の質問に答えます。Javaでポインターへのポインター(参照への参照)を行う簡単な方法が見つかりませんでした。そこで、コードをリファクタリングして、ポインターの代わりに参照の配列と配列インデックスを使用するようにしました。これはうまくいくと思います(簡単にコーディングできます) が、まだテストしていません。

于 2012-06-20T22:33:39.637 に答える
0

Javaにはポインタがありません。Objectただし、を作成すると、そのへの参照(ポインタ)が作成されていると言えますObject

例えば:

Object obj = new Object();

したがって、参照は実際には、作成したばかりobjの新しいものを指しています。Object

ここで、ポインターの概念をポインターに変換する場合は、既存の参照を指す参照を作成するだけで済みます。

Object obj = new Object();
Object obj2;
obj2 = obj;
于 2012-06-20T19:35:14.167 に答える
0

「ポインターのような」メソッドは unsafe() だけです。それを使用してメモリを割り当てることができます。ただし、JVM 領域の外に出ることはできません :)

于 2012-06-20T20:47:28.267 に答える