c# - 像: palette[ val & 3 ]?这样C的二维数组访问的C#模拟是什么

标签 c# c arrays multidimensional-array jagged-arrays

在C代码中定义了这样的数组:u8 palette[4][4];

后来一些元素像这样访问:palette[ val & 3 ]

在 C 代码中,它是这样使用的:memcpy(dest3+12, palette[ val & 3 ], 4);

我不明白通过这段代码访问了什么元素。 我试图在 C# 中做同样的事情,但它告诉我 Wrong number of indices inside [];预期 2

最佳答案

在 C 中,您可以指向数组中的特定行,因为 C 数组只是项目的序列。两个后续数组再次只是项目序列,这就是为什么可以在 C 中访问子数组的原因。这就是为什么不能仅从数组指针获取 C 中数组大小的原因。

在 C# 中,有两种类型的“多维”数组:Multidimensional arraysJagged Arrays .

经典的多维不能仅通过子索引访问,因为C#中的数组不仅仅是一个项目序列,还有一个header in which contain size of array, type pointer and sync block。 .两个后续的 C# 数组将在内部包含一个 header ,并且它不符合 C# 数组格式。

Jagged array是数组的数组,您可以使用类似于 C# 的方式访问仅具有子索引的子数组。

C# 中的等效代码为:

byte[][] palette = new byte[4][];

for (int i = 0; i < palette.Length; i++)
{
   palette[i] = new byte[4];
}

byte[] destination = new byte[4];

int val = 1;
Array.Copy(palette[val & 3], 0, destination, 12, 4);

请注意,在 memcpy 中参数顺序为:destination, source 而在 Array.Copy 中是倒序的参数:source, destination

关于c# - 像: palette[ val & 3 ]?这样C的二维数组访问的C#模拟是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36940339/

相关文章:

arrays - 有效地将 bool 数组更改为字符串 - Swift

java - 能够在JAVA数组中插入超过其长度的值

c# - 当命令在 .NET 中的 FTP 服务器上失败时会发生什么?

c - getchar() 在尝试扫描输入时跳过第一个字符

C:指针困惑

c - 用于循环数组?

c# - 如何缩短通往特性的路径?

c# - 正则表达式按最后一个索引拆分

c# - 选择无法打印到控制台

c - 使用带有 while 循环的 scanf 输入两个单独的字符串