c - 将一行多维数组作为参数传递
问题描述
我的 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]
,但类型错误?还是编译器的问题?
解决方案
意识到就像一维数组一样,多维数组只是指向数据开头的指针
不,不是在一维或多维数组的情况下。数组是数据块。它不是指针。在大多数其他表达式中使用时,它确实转换为指向第一个元素的指针(甚至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 非常高。你应该给他们看看。
推荐阅读
- mysql - 如何将二进制(16)作为参数传递给mysql函数
- google-sheets - 无权在 Google Apps 脚本中调用 setBackground
- java - 如何为每个列表视图项使用不同的背景颜色
- ruby-on-rails - 我试图在显示页面上显示我的帖子标题,但它一次又一次地显示此错误。我是 Rails 的初学者
- javascript - 使用 JMeter 执行浏览器的 JavaScript
- authentication - 团队机器人中的身份验证问题:如何强制打开选项卡?
- asp.net - 您可以忽略 DLL 中的值吗?
- wordpress - 有没有人在 WordPress 网站上显示过 Salesforce 仪表板组件?如果是这样,怎么做?
- c - 使 fork 执行相同的次数,无限次
- firebase - 在哪里初始化 initState() 中所需的变量?