我在C程序具有被定义为一个int origF [6][6][4]
3D阵列。我也有一个功能void displayPM (int tile [])
,而我通过origF [i][j]
作为参数,这在逻辑上使的感觉。它的工作原理,因为它应该(当displayPM
读取tile [k]
它得到的值origF [i][j][k]
然而,编译器(它的Turbo C ++在VirtualBox中)发出警告可疑指针转换并提供了解释:遇到一个指针的一些转换引起指针编译器指向不同的类型。你应该使用强制转换是否适当抑制这种警告。
意识到就像一维数组,一个milti维数组只是一个指向数据的开始,是什么类型,然后origF [i][j]
?因为它的正常工作,它仍然是一个指针,它指向origF [i][j][0]
,但错误的类型?或者是编译器的问题?
认识到,就像一维阵列,milti维阵列仅仅是一个指针,指向数据的开头
号没有在一个或多维阵列的情况下。一个阵列是数据块。它不是一个指针。在大多数其他表达式(甚至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。你应该给他们看看。