无法在初始化中将 'float****' 转换为 'float (*)[128][3][4]'

trx*_*yp1 5 c arrays pointers matrix multidimensional-array

我有以下 2 个 typedef:

\n
typedef float matrix_3x4[3][4];\ntypedef matrix_3x4 bone_mat[128];\n
Run Code Online (Sandbox Code Playgroud)\n

以及以下函数定义:

\n
float ****get_bones();\n
Run Code Online (Sandbox Code Playgroud)\n

为什么下面的代码给我一个类型转换错误?

\n
bone_mat *mat = get_bones();\n
Run Code Online (Sandbox Code Playgroud)\n

错误:

\n
error: cannot convert \xe2\x80\x98float ****\xe2\x80\x99 to \xe2\x80\x98float (*)[128][3][4]\xe2\x80\x99 in initialization\n   85 |     bone_mat *mat = get_bones();\n      |                     ~~~~~~~~~^~\n      |                              |\n      |                              float****\n
Run Code Online (Sandbox Code Playgroud)\n

尝试将 的类型更改matbone_matbone_mat**,但不应float(*)[128][3][4]与 相同float****

\n

将函数的返回值转换为(bone_mat*)也不起作用。

\n

chq*_*lie 2

指针不是数组。指针可以指向数组的元素。 float ****是一个指向一个指针的指针,一个指向一个指针的指针float,这是一个在现实生活项目中不太可能遇到的对象。

mat是一个指向 a 的指针bone_mat,它本身是一个数组或 128 个由 3 个 4 个浮点数组组成的数组,这是一种非常不同类型的野兽。

如果您将源代码发布到get_bones(),如果它返回一个实际的float ****,我会感到惊讶,我敢打赌它会为 a 分配内存bone_mat并将对象指针转换为与分配大小和块使用不一致的类型。

引用Brian61354270

考虑一下涉及的内存和地址。float*** *是一个指向 a 的指针float***。这意味着当您取消引用 a 时float****,您将到达内存中包含 a 的位置float***。不是一个float,而是一个指向另一个指针的指针。取消引用该指针,您将到达包含 a 的位置float**,但仍然不是 a float,而是另一个指向指针的指针。我可以继续前进。与之对比float (*)[128][3][4],它是一个指向具有 128 * 3 * 4 个连续浮点数的内存块的指针。