c - 这个函数调用和定义如何排列?
问题描述
我刚刚在 C 中遇到了这个函数调用/声明对,我有点困惑(我是这里的新手,但我没有在我一直用来学习的任何材料中看到这个问题)。函数声明为bool read_matrix(double a[][M], int n, int m)
,但由 调用read_matrix((double (*)[M]) a, n, m)
。(M 是一个由 设置的整数#define
。)这些参数如何相互对齐?就此而言,(*)[M] 是什么类型的对象?
感谢您消除混乱。
解决方案
当使用此函数声明中的数组类型声明的函数参数时
bool read_matrix(double a[][M], int n, int m);
然后它被编译器调整为指向元素类型的指针。
所以这个函数声明等价于声明
bool read_matrix(double ( *a )[M], int n, int m);
另一方面,在表达式中使用的数组指示符(例如作为参数)被转换为指向它们的第一个元素的指针。
因此,如果在函数的调用者中有一个声明为
double a[N][M];
然后传递给函数
read_matrix( a, N, M );
它被转换为指向其类型的第一个元素的指针int ( ^ )[M]
。
至于你展示的电话中的演员表
read_matrix((double (*)[M]) a, n, m)
那么如果a
是一个如上所示声明的数组,那么强制转换是多余的。这种转换是隐式发生的。
推荐阅读
- python - 在包含 QWidget 的相对于包含 QWidget 的坐标处添加 QWidget
- amazon-web-services - 如何在 AWS RDS 安全类中激活自动 IP 更改
- ios - iOS Chrome 投射问题
- javascript - Openlayers - 不能通过双击删除线和点
- android - 如何使用 clearTillFirstAndShowView Stacked 导航过渡
- javascript - create-react-app (CRA) 是否删除了模块的未使用部分(在生产构建中)?
- sql - Oracle SQL 组查询返回多个“相同”行
- c++ - CMake gtest'错误运行测试可执行文件'结果:24
- swift - 既然已弃用launchUserNotificationUserInfoKey,我如何检测用户是否通过单击macOS上的通知启动了应用程序?
- python - 从文件夹中读取多组 csv 文件,并使用 spark 或 databricks 并行插入到相应的目标表中