我想弄清楚那些原型是什么意思
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 *));
答案 0 :(得分:3)
首先,您应该找到正在声明的实际变量。在所有3个示例中,这是fpData
。然后你应该开始阅读这个从内到外的变量的声明。
所以,让我们从第一个例子开始。我们看到fpData
,所以我们说" fpData是...",然后我们看到" *"在" fpData"之前,我们说" fpData指向...",然后我们看到*fpData
之外的函数类型声明,所以我们说" fpData是指向函数的指针......"。然后我们应该读取参数的类型和这个函数的结果。
好吧,你可以毫无问题地阅读所有3个参数的类型。他们是:
const char *
到int" const char *
到int" 在最后一个论点中,您应该注意[3]
的优先级高于" *"。我的意思是,当从内到外读取声明时,你应该读取第一个数组然后指针。 I. e。 int *a[3]
是" a是一个长度为3的指针int"而不是"指向数组的指针"。
假设所有这些我认为你可以毫无问题地阅读第二次声明。
现在你应该学习这个:函数结果的类型写在外面(即之前和之后)其他所有内容。
让我们考虑一下:
char (*(*fp)(int))(double)
这意味着什么?好吧,让我们开始阅读," fp是指向函数的指针,它接受int并返回......什么?"好吧,我们已经阅读了(*fp)(int)
部分。现在我们想要阅读其他所有内容。我们想要了解我们已经读过的函数的结果类型是什么。现在我们应该注意到函数的结果是在其他所有东西之外写的东西(即,之前和之后),i。即在我们已经读过的内容之外。
所以,我们已阅读(*fp)(int)
。其他的,我。即char (*XXX)(double)
是我们已经读过的函数的返回类型。所以,好吧,让我们继续阅读。最后我们会得到这个:
" fp是指向函数的指针,该函数获取int并返回指向函数的指针,该函数获取double并返回char"。
现在你可以毫无问题地阅读第三个声明了
答案 1 :(得分:1)
chux发布的 C乱码↔英语链接看起来仍然像胡言乱语 我。所以我试着听起来更人性化了:
int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *),
int (*fpCalculation[3]) (const char *));
这声明了一个函数指针fpData
,它返回一个指向int
的指针。该
function接受以下类型的3个变量:
paIndex
是指向维度为3的int
数组的指针。这可用于
例如,你有这个:
void bar(int (*paIndex)[3])
{
}
void foo(void)
{
int fields[5][3] = { {1,1,1}, ... };
bar(fields);
}
fpMsg
是一个返回int
的函数指针。该功能需要一个
仅参数,const char*
(基本上是一个字符串)。
fpCalculation
是返回的函数指针的维数3的数组
int
。这些函数仅用于参数:const char*
。
这是一个函数指针的野兽,它在这样的环境中工作:
#include <stdio.h>
int msg(const char *name)
{
printf("msg: %s\n", name);
return 0;
}
int abc1(const char *name)
{
printf("abc1: %s\n", name);
return 0;
}
int abc2(const char *name)
{
printf("abc2: %s\n", name);
return 0;
}
int *scary_function(int (*paIndex)[3] , int (* fpMsg) (const char *),
int (*fpCalculation[3]) (const char *))
{
fpMsg("fpMsg");
fpCalculation[0]("fpCalculation0");
fpCalculation[1]("fpCalculation1");
fpCalculation[2]("fpCalculation2");
for(int i = 0; i < 4; ++i)
{
for(int j = 0; j < 3; ++j)
{
printf("%-3d ", paIndex[i][j]);
}
puts("");
}
return NULL;
}
void foo(void)
{
int matrix[4][3] = { {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} };
int (*fpcalcs[3])(const char*) = { msg, abc1, abc2 };
int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *),
int (*fpCalculation[3]) (const char *));
fpData = scary_function;
// calling the function through the function pointer
fpData(matrix, msg, fpcalcs);
}
int main(void)
{
foo();
return 0;
}
这是
的输出msg: fpMsg
msg: fpCalculation0
abc1: fpCalculation1
abc2: fpCalculation2
1 2 3
4 5 6
7 8 9
10 11 12
所以我详细解释了如何解析这些函数的声明 指针。现在尝试自己了解其他2,如果你还有问题, 发表评论。
答案 2 :(得分:1)
1.int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *), int (*fpCalculation[3]) (const char *));
这里,fpdata
是指向一个函数的指针,该函数接受三个参数并返回一个指向整数的指针。参数如下:
2.int* (*fpData[2])(int (*paIndex)[3] , int (* fpMsg) (const char *), int (* fpCalculation[3]) (const char *));
在这种情况下,fpdata
是 2 个函数指针的数组,每个函数接受三个参数 -
返回类型是一个整数指针
3.int* (*(*fpData)(const char *))(int (*paIndex)[3] , int (* fpMsg) (const char *), int (* fpCalculation[3]) (const char *));
最后,fpdata
是一个指向带有三个参数的函数的指针 -
返回类型是一个以const char指针为参数的函数指针,返回类型是一个整数指针。
答案 3 :(得分:0)
int* (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *),
int (*fpCalculation[3]) (const char *));
它是函数原型声明。
fpData是一个函数名,该函数带有三个参数:
int (*paIndex)[3]
int (* fpMsg) (const char *)
int (*fpCalculation[3]) (const char *)
…并返回函数指针[指向不带参数但返回整数的函数的指针]。
详细信息::给定功能可以编写如下
typedef int* (*ret_func_ptr) ();
ret_func_ptr (*fpData)(int (*paIndex)[3] , int (* fpMsg) (const char *),
int (*fpCalculation[3]) (const char *));