如何在Java中实现类似C语言的数组中间元素指针式操作
如何在C#中模拟C语言指针算术写入数组指定位置
我有一个byte缓冲区,希望设置一个标识指向待写入的首个元素,该元素不一定是数组本身的首个元素。现有如下uint32ToBuffer方法:
private void uint32ToBuffer(int val, byte[] buffer) { buffer[0] = (byte)val; buffer[1] = (byte)(val >>> 8); buffer[2] = (byte)(val >>> 16); buffer[3] = (byte)(val >>> 24); }
我想要执行类似C语言的操作:
byte[] buffer = new byte[512]; uint32ToBuffer(3, &buffer[2]);
但显然无法实现。请问能否在不让uint32ToBuffer方法知晓写入起始位置的前提下,实现类似C语言的指针算术逻辑?
可以实现,推荐以下两种方案:
1. 使用Span<byte>(最优解)
C# 7.2及以上引入的Span<T>完美适配这种场景,它可以对数组进行切片,切片后的Span<byte>的索引0会对应原数组的指定起始位置。只需修改方法的参数类型为Span<byte>,内部逻辑完全无需改动:
private void uint32ToBuffer(int val, Span<byte> buffer) { buffer[0] = (byte)val; buffer[1] = (byte)(val >>> 8); buffer[2] = (byte)(val >>> 16); buffer[3] = (byte)(val >>> 24); }
调用时直接对原数组进行切片传递:
byte[] buffer = new byte[512]; uint32ToBuffer(3, buffer.AsSpan(2)); // 切片从索引2开始,方法内的buffer[0]对应原数组的buffer[2]
这种方式下,uint32ToBuffer完全不需要感知写入的起始偏移,逻辑和原方法一致,同时避免了额外内存开销,和C语言的指针算术效果完全等价。
2. 临时数组中转(兼容旧版本)
如果项目使用的是不支持Span<T>的C#版本,可以通过临时数组中转,无需修改原方法:
// 原方法保持不变 private void uint32ToBuffer(int val, byte[] buffer) { buffer[0] = (byte)val; buffer[1] = (byte)(val >>> 8); buffer[2] = (byte)(val >>> 16); buffer[3] = (byte)(val >>> 24); } // 调用逻辑 byte[] buffer = new byte[512]; byte[] tempBuffer = new byte[4]; uint32ToBuffer(3, tempBuffer); Array.Copy(tempBuffer, 0, buffer, 2, 4); // 将临时数组内容拷贝到原数组的指定位置
这种方式会产生额外的临时数组内存开销,效率不如Span<T>,仅适合老旧项目场景。
内容的提问来源于stack exchange,提问作者VojtaK
相关产品推荐
相关产品推荐

