float *
可以指向浮点数组的第一个元素,并且应该 reinterpret_castable 到该数组类型。并且该转换的结果可能指向 a 的第一个元素,float [][]
因此应该 reinterpret_castable 到该类型,依此类推。你应该能够组成这样的演员表,然后直接做
float (&arr)[2][2] = *reinterpret_cast<float (*)[2][2]>(matrixReturnAsArray);
类型的参数float **
不相同,不应以这种方式使用。
为避免未定义的行为,指针必须源自实际的多维数组,如果float*
直接使用,则不能访问多维矩阵的第一行。
void foo(float *f) {
f[3] = 10.;
float (&arr)[2][2] = *reinterpret_cast<float (*)[2][2]>(f);
arr[1][1] = 10.;
}
void main() {
float a[2][2];
foo(&a[0][0]); // f[3] = 10.; is undefined behavior, arr[1][1] = 10. is well defined
float b[4];
foo(&b[0]); // f[3] = 10.; is well-defined behavior, arr[1][1] = 10. is undefined
}
据我所知,没有float arr[2][2];
任何保证&arr[0][1] + 1
与 相同。&arr[1][0]
因此,尽管您可以将一维数组用作多维数组,但您不能将多维数组视为一f[i*width + j]
维数组。
最好使用 C++ 的编译时类型安全,而不是仅仅依靠不意外地传递错误的东西或执行错误的 reinterpret_cast。要使用原始数组获得类型安全,您应该使用对所需原始数组类型的引用:
void foo(float (&f)[2][2]) {}
void foo(float (&f)[3][3]) {}
如果要按值传递数组,则不能使用原始数组,而应使用 std::array 之类的东西:
void foo(std::array<std::array<float,2>,2> f) {}
void foo(std::array<std::array<float,3>,3> f) {}