trx*_*yp1 5 c arrays pointers matrix multidimensional-array
我有以下 2 个 typedef:
\ntypedef float matrix_3x4[3][4];\ntypedef matrix_3x4 bone_mat[128];\n
Run Code Online (Sandbox Code Playgroud)\n以及以下函数定义:
\nfloat ****get_bones();\n
Run Code Online (Sandbox Code Playgroud)\n为什么下面的代码给我一个类型转换错误?
\nbone_mat *mat = get_bones();\n
Run Code Online (Sandbox Code Playgroud)\n错误:
\nerror: 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尝试将 的类型更改mat
为bone_mat
或bone_mat**
,但不应float(*)[128][3][4]
与 相同float****
?
将函数的返回值转换为(bone_mat*)
也不起作用。
指针不是数组。指针可以指向数组的元素。 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 个连续浮点数的内存块的指针。