首页 > 解决方案 > 这个函数调用和定义如何排列?

问题描述

我刚刚在 C 中遇到了这个函数调用/声明对,我有点困惑(我是这里的新手,但我没有在我一直用来学习的任何材料中看到这个问题)。函数声明为bool read_matrix(double a[][M], int n, int m),但由 调用read_matrix((double (*)[M]) a, n, m)。(M 是一个由 设置的整数#define。)这些参数如何相互对齐?就此而言,(*)[M] 是什么类型的对象?

感谢您消除混乱。

标签: cpointersmultidimensional-arrayimplicit-conversionfunction-declaration

解决方案


当使用此函数声明中的数组类型声明的函数参数时

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是一个如上所示声明的数组,那么强制转换是多余的。这种转换是隐式发生的。


推荐阅读