You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:32:18