将2d数组重新解释为指针

时间:2014-08-23 06:02:27

标签: c++ arrays pointers

假设我有一个这样的数组:

unsigned char a[10][10];

我想使用fread将字节读入此数组(行主要顺序):

FILE *f = fopen("xxx.bin", "rb");
fread((unsigned char *)a, 1, 10 * 10, f);
fclose(f);

由于fread的第一个参数属于void *类型,是否有标准方式将unsigned char a[10][10]转换为void *?我应该使用static_cast还是reinterpret_cast或?由于c ++中的2d数组是连续分配的,我认为将其重新解释为指针是合理的。

2 个答案:

答案 0 :(得分:2)

为了让void*指向a,只需取其地址(&a)并让编译器隐式转换为void*

fread(&a, sizeof a, 1, f);

有几点需要注意:

  • 首先,您会痛苦地关闭文件,但是您无法检查读取错误。
  • 每当使用reinterpret_cast时,使用结果的唯一方法是将其重新解释为将其重新设置为前一种类型。一般情况下,您不能使用reinterpret_cast,除非您需要例如将指针存储在整数中。正如其他人所提到的,static_cast是要走的路。
  • 绝不使用C风格的演员。他们很危险,他们根本不记录发生了什么。 FWIW,你可以对你的数组进行常量修饰,你的代码很乐意在运行时编译和中断,因为你覆盖了编译器的安全开关。
  • 我不会指望在矩阵的行之间没有填充,即它的大小不会只是100.您只能使用每行的单独读取操作来解决这个问题。我不确定这一点,很可能是它的大小保证不包含任何填充。

答案 1 :(得分:1)

以下内容适用于gcc 4.8.2:

FILE *f = fopen("xxx.bin", "rb");
fread(a, sizeof(unsigned char), 10 * 10, f);
fclose(f);

如果您更喜欢显式强制转换,那么标准方法是使用static_cast。应该使用它,因为它在转换为void*时会保留地址。

FILE *f = fopen("xxx.bin", "rb");
fread(static_cast<void*>(a), sizeof(unsigned char), 10 * 10, f);
fclose(f);

reinterpret_cast只保证如果您将某些内容投射到void*然后再投放回您的类型,那么您将获得相同的值。