float *
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];
ことを保証するものは何もありません。したがって、1次元配列を多次元配列として使用することはできますが、多次元配列を1次元配列のように扱うことはできません。&arr[0][1] + 1
&arr[1][0]
f[i*width + j]
誤って間違ったものを渡したり、間違ったreinterpret_castを実行したりしないことに依存するのではなく、C++のコンパイル時の型安全性を使用することをお勧めします。raw-arraysを使用して型の安全性を得るには、必要なraw配列型への参照を使用する必要があります。
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) {}