java 如何偏移指针
在 Java 中,指针的概念与 C/C++ 不同,因为 Java 没有显式的指针操作。但可以通过数组、ByteBuffer 或 Unsafe 类模拟指针偏移行为。以下是几种常见方法:
使用数组索引模拟指针偏移
通过数组索引实现类似指针偏移的效果,直接操作数组元素:
int[] array = {1, 2, 3, 4, 5};
int offset = 2; // 偏移量
int value = array[offset]; // 获取偏移后的值(相当于 array + offset)
array[offset] = 10; // 修改偏移后的值
使用 ByteBuffer 进行字节级偏移
ByteBuffer 提供对底层字节的精确控制,支持绝对和相对位置操作:
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.putInt(0, 100); // 在位置0写入int
buffer.putInt(4, 200); // 在位置4写入另一个int(int占4字节)
int value = buffer.getInt(4); // 读取偏移4字节后的值
通过 Unsafe 类直接操作内存(高风险)
sun.misc.Unsafe 允许直接内存访问,但需谨慎使用(Java 9+ 可能受限):

Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
long address = unsafe.allocateMemory(16); // 分配16字节内存
unsafe.putInt(address + 4, 123); // 在基址+4偏移处写入int
int result = unsafe.getInt(address + 4); // 读取偏移后的值
注意事项
- 数组和
ByteBuffer是安全的选择,推荐优先使用。 Unsafe会绕过 JVM 安全检查,可能导致 JVM 崩溃或安全漏洞。- Java 的“指针”操作始终受限于 JVM 管理,无法像 C/C++ 那样直接访问任意内存地址。






