Cで次の宣言があれば、これを書くことができます
char tab[64];
(*(uint32_t*)(tab[0]));
つまり、この種のキャストを適用すると、(*(uint32_t*)
タブのアドレスを取得するためにJavaでこれを実装する別の方法はありますか?
どうもありがとう
Java 言語は、ポインターを使用した直接操作 (算術など) をサポートしていません。したがって、ポインタを直接操作するための機能を開発者に提供することは不合理です。
タブのアドレスを取得するためにJavaでこれを実装する別の方法はありますか?
いいえ、ありません。
Java では、 along[]
と aint[]
は根本的に異なる型であり、一方が他方であると偽ったり、その逆を行ったりすることはできません。
簡単な解決策は、シフトとマスキングを使用して、個々のlong
値の上位 32 ビット部分と下位 32 ビット部分を抽出することです。
別の方法として、long の配列を a でラップしてから、そのビューLongBuffer
を作成することもできます。しかし、それは(IMO)面倒であり、実際には、カバーの下で行われているシフト/マスキングを隠しているだけです.IntegerBuffer
コメントは、問題は実際にはバイト配列をポインターの配列として扱うことに関するものであることを指摘しています。
それも不可能です...そして賢明な回避策はありません。標準 Java では、ビット パターンをポインターに変換したり、その逆を行うことはできません。(これを行うために使用できるいくつかのトリックがありますが、それらは根本的に安全ではなく、正しく行わないと JVM がクラッシュする可能性があります。)
達成しようとしていることが何であれ、それを Java でコーディングする別の方法を見つける必要があります。
シフトとマスクを使用して 32 ビットの int を構築する必要があります。
Java の参照は、C のポインターのように受動的ではありません。オブジェクトのアドレスはいつでも変更される可能性があるため、値が参照であることを JVM が認識していない場合、値を正しく更新できません。
質問に文字通り答えると、 Unsafe クラスを使用してこれを行うことができますが、オブジェクトがメモリ内でどのように配置されるかに関心がある場合にのみ役立ちます。値を変更すると、JVM がランダムにクラッシュする可能性があります。
タブのアドレスを取得するためにJavaでこれを実装する別の方法はありますか?
なぜこれを行おうとしているのかを見ると、Java では解決策がまったく異なり、ポインターをまったく必要としないことに気付くでしょう。