trx*_*yp1 5 c arrays pointers matrix multidimensional-array
我有以下 2 个 typedef:
\ntypedef float matrix_3x4[3][4];\ntypedef matrix_3x4 bone_mat[128];\nRun Code Online (Sandbox Code Playgroud)\n以及以下函数定义:
\nfloat ****get_bones();\nRun Code Online (Sandbox Code Playgroud)\n为什么下面的代码给我一个类型转换错误?
\nbone_mat *mat = get_bones();\nRun 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****\nRun 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 个连续浮点数的内存块的指针。