-1

鉴于 C 中的以下声明,我可以这样写

char tab[64];
(*(uint32_t*)(tab[0]));

换句话说,应用这种类型的演员表(*(uint32_t*)

有没有另一种方法可以在java中实现这个来获取标签的地址?

非常感谢

4

4 回答 4

4

Java 语言不支持使用指针(算术等)的直接操作。因此,让开发人员直接使用指针是不合理的。

于 2012-08-02T11:49:56.790 回答
3

有没有另一种方法可以在java中实现这个来获取标签的地址?

不,那里没有。

在 Java 中 along[]和 aint[]是根本不同的类型,你不能假装一个是另一个,反之亦然。

简单的解决方案是使用移位和掩码来提取各个long值的高 32 位和低 32 位部分。

另一种选择可能是将 long 数组包装在 a 中LongBuffer,然后创建它的IntegerBuffer 视图。但这(IMO)很麻烦,实际上只是隐藏了在幕后进行的转移/掩蔽。


评论指出,问题实际上是将字节数组视为指针数组。

这也不可能......而且没有明智的解决方法。标准 Java 不允许您将位模式转换为指针,反之亦然。(您可以使用一些技巧来做到这一点,但它们从根本上是不安全的,如果您没有完全正确地使用它们,它们很可能会导致您的 JVM 崩溃。)

无论您想要实现什么,您都应该找到一种不同的方式来用 Java 对其进行编码。

于 2012-08-02T11:50:49.910 回答
1

您需要使用移位和掩码构造 32 位 int。

于 2012-08-02T11:49:54.400 回答
0

Java 中的引用不像 C 中的指针那样是被动的。对象的地址可以随时更改,因此如果 JVM 不知道值是引用,它就无法正确更新它。

从字面上回答您的问题,您可以使用 Unsafe 类来执行此操作,但它仅在您对对象在内存中的布局感兴趣时才有用。更改这些值可能会导致 JVM 随机崩溃。

有没有另一种方法可以在java中实现这个来获取标签的地址?

如果您查看为什么要尝试这样做,您可能会发现在 Java 中解决方案完全不同,根本不需要指针。

于 2012-08-02T12:23:48.903 回答