c - 指向函数原型的指针
问题描述
我想弄清楚这些原型是什么意思
1.int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *),
int (*fpCalculation[3]) (const char *));
2.int* (*fpData[2])(int (*paIndex)[3] , int (* fpMsg) (const char *),
int (* fpCalculation[3]) (const char *));
3.int* (*(*fpData)(const char *))(int (*paIndex)[3] ,
int (* fpMsg) (const char *),
int (* fpCalculation[3]) (const char *));
解决方案
首先,您应该找到正在声明的实际变量。在所有 3 个示例中,这是fpData
. 然后你应该开始阅读从这个变量开始从内到外移动的声明。
所以,让我们从第一个例子开始。我们看到fpData
,所以我们说“fpData is...”,然后我们在“fpData”之前看到“*”,所以我们说“fpData is pointer to...”,然后我们看到函数类型声明在 之外*fpData
,所以我们说“fpData 是指向函数的指针……”。然后我们应该读取这个函数的参数类型和结果。
好吧,您可以毫无问题地读取所有 3 个参数的类型。他们是:
- “paIndex 是指向长度为 3 的整数数组的指针”
- “fpMsg 是从函数
const char *
到 int 的指针” - “fpCalculation 是长度为 3 的指针数组,从函数
const char *
到 int”
在最后一个参数中,您应该注意它[3]
的优先级高于“*”。我的意思是,在从内到外读取声明时,您应该先读取数组,然后再读取指针。IE。int *a[3]
是“a 是长度为 3 的 int 指针数组”,而不是“指向数组的指针”。
假设所有这些,我认为您可以毫无问题地阅读第二个声明。
现在您应该了解这一点:函数结果的类型写在其他所有内容之外(即之前和之后)。
让我们考虑一下:
char (*(*fp)(int))(double)
这意味着什么?好吧,让我们开始阅读,“fp 是指向函数的指针,它接受 int 并返回......什么?” 好吧,我们已经阅读(*fp)(int)
了部分。现在我们要阅读其他所有内容。我们想了解我们已经阅读过的函数的结果类型。现在我们应该注意,函数的结果是写在其他所有内容之外(即之前和之后)的东西,即在我们已经阅读的内容之外。
所以,我们已经阅读了(*fp)(int)
. 其他所有内容,即char (*XXX)(double)
我们已经阅读过的函数的返回类型。所以,好吧,让我们继续阅读。最后我们会得到这个:
“fp 是指向函数的指针,该函数获取 int 并返回指向函数的指针,该函数获取 double 并返回 char”。
现在您可以毫无问题地阅读第三个声明
推荐阅读
- php - Codegniter 4.0.0 中的 PHPMailer
- ruby-on-rails - 在 Rails 中创建动态属性和 CSS 类
- mysql - 在 MySql 中使用递归生成 ID 序列
- mongodb - 从 MongoDB 查询/聚合管道创建特定形状的结果
- r - 如何在更改时仅给出新值的情况下完成缺失的时间序列数据?
- python - 如何在for循环中获得输出总和
- google-sheets - 在 Google 表格中,我可以查询 DXY 吗?
- python - Numpy:以有效的方式计算每个行子集的平均值
- flutter - 如何在flutter中实现圆角bottomAppbar?
- flutter - 带有 SliverAppBar 的 Flutter TabBar 不保持滚动状态