将多维数组转换为另一种类型的多维数组

Cast multidimensional array to multidimensional array of another type

我有

const uint8_t longByteTable[16][256][16] = { { { 0x00, ... } } };

声明为硬编码八位字节值的三维 16x256x16 数组。

出于优化目的和其他各种原因,我需要将此数组解释为 uint64_t 值的三维 16x256x2 数组:

const uint64_t reinterpretedTable[16][256][2];

我需要的是一种有效的投射方式 longByteTable reinterpretedTable 在严格 ISO/ANSI C 内。这是:

const uint64_t (*reinterpretedTable)[256][2] = 
    (const uint64_t(*)[256][2])longByteTable;

正确的方法?

P.S。我不能用后一种类型声明 longByteTable 因为那样它就不能在不同的字节序下正常工作,我要么需要为不同的字节序声明不同的表,要么执行一些运行时检查和轮换。是的,重新解释的数组的所有进一步转换都是字节顺序不变的。

由于 C 的指针别名规则,您不能进行此类转换。唯一安全的方法是使用联合:

typedef union
{
  uint8_t longByteTable[16][256][16]
  uint64_t reinterpretedTable[16][256][2];
} table_t;

const table_t table;

但请注意,这仍然会使您的代码依赖字节顺序。使代码与字节序无关的唯一方法是使用位移位分配值 to/from 更大的整数类型。