首页 > 解决方案 > 指向函数原型的指针

问题描述

我想弄清楚这些原型是什么意思

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 *));

标签: carrayspointerscasting

解决方案


首先,您应该找到正在声明的实际变量。在所有 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”。

现在您可以毫无问题地阅读第三个声明


推荐阅读