将多维数组的行作为参数传递

时间:2019-02-05 05:41:55

标签: c pointers multidimensional-array casting compiler-warnings

我的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],但类型错误?还是编译器有问题?

1 个答案:

答案 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很高。您应该看看他们。