首页 > 解决方案 > 将一行多维数组作为参数传递

问题描述

我的 C 程序有一个 3D 数组,定义为int origF [6][6][4]. 我还有一个函数void displayPM (int tile []),我将origF [i][j]其作为参数传递给它,这在逻辑上是有意义的。它按应有的方式工作(displayPM读取时tile [k]它得到 value origF [i][j][k]。但是,编译器(它是 VirtualBox 中的 Turbo C++)发出警告Suspicious pointer conversion并解释:编译器遇到了一些指针转换,导致指针指向不同的类型。如果转换正确,您应该使用强制类型转换来抑制此警告。

意识到就像一维数组一样,多维数组只是指向数据开头的指针,那是什么类型origF [i][j]呢?由于它工作正常,它仍然是一个指针,它指向origF [i][j][0],但类型错误?还是编译器的问题?

标签: cpointersmultidimensional-arraycastingcompiler-warnings

解决方案


意识到就像一维数组一样,多维数组只是指向数据开头的指针

不,不是在一维多维数组的情况下。数组数据块。它不是指针。在大多数其他表达式中使用时,它确实转换为指向第一个元素的指针(甚至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 非常高。你应该给他们看看。


推荐阅读