我的C语言程序具有一个定义为int origF [6][6][4]
的3D数组。我还有一个函数void displayPM (int tile [])
,我将origF [i][j]
作为参数传递给了函数,这在逻辑上是有意义的。它可以按预期方式工作(displayPM
读取tile [k]
时得到的值是origF [i][j][k]
。但是,编译器(VirtualBox中为Turbo C ++)发出警告可疑指针转换< / strong>,并附有解释:编译器遇到了指针的某种转换,导致该指针指向另一种类型。如果转换正确,则应使用强制转换来禁止显示此警告。
意识到,就像一维数组一样,多维数组只是指向数据开头的指针,那么origF [i][j]
是什么类型?由于它工作正常,它仍然是一个指针,它指向origF [i][j][0]
,但类型错误?还是编译器有问题?
答案 0 :(得分:1)
意识到,就像一维数组一样,多维数组只是指向数据开头的指针
不。一个或多维数组不是这种情况。数组是数据块。它不是指针。在大多数其他表达式中使用时,它确实将转换指向第一个元素的指针(甚至origF[i]
实际上是*(origF + i)
),但它本身并不是指针。>
origF
是一个数组。当您对其进行索引时,该对象将被转换为指向数组的指针。它变成int (*)[6][4]
。您也可以创建此类指针。
int (*p)[6][4] = origF; // Here origF is decaying to a pointer to its first element.
然后取消引用,您将获得数组类型为int[6][4]
的表达式。对于一个需要的维度,这也“递归”发生。
因此,回到您的示例,您想知道origF [i][j]
是什么。这是一个具有数组类型的表达式。类型为int[4]
。当您将其传递给函数时,它将自动转换为int*
。
这是在语言级别上,当时编译器作者似乎还没有意识到。没有进行任何可疑的转换。唯一的怀疑应该针对编写该警告的人。它实际上建议您添加强制转换(即,使其静音)并可能破坏程序。再次说明,您所做的并不是所有错误,但这通常是非常糟糕的建议。
无论如何,由于TurboC已停产,因此使用现代编译器会更好。 GCC和Clang分别是免费软件和开源软件,并且它们的QoI很高。您应该看看他们。