通过多维数组的行作为一个参数

问题描述 投票:0回答:1

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

c pointers multidimensional-array casting compiler-warnings
1个回答
1
投票

认识到,就像一维阵列,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。你应该给他们看看。

© www.soinside.com 2019 - 2024. All rights reserved.