int *(*)(int *,int *(*)())
我想知道它是什么类型的? ,有人可以举例说明使用这种类型的声明。
任何帮助都会很棒。
感谢。
答案 0 :(得分:19)
它是一个指向函数的指针,它返回int*
并接受int*
和指向返回int*
的函数的指针(并接受未定义数量的参数;请参阅注释)。
一些例子(看起来不太好,它只是构造成包含所提到的声明):
#include <stdio.h>
static int a = 10;
int* f1() {
return &a;
}
static int b;
int* f2(int *j, int*(*f)()) {
b = *j + *f();
// this is just for demonstrational purpose, such usage
// of global variable makes this function not thread-safe
return &b;
}
int main(int argc, char *argv[]) {
int * (*ptr1)();
int * (*ptr2) (int * , int * (*)());
ptr1 = f1;
ptr2 = f2;
int i = 42;
int *pi = ptr2(&i, ptr1);
printf("%d\n", *pi);
return 0;
}
// prints 52
答案 1 :(得分:7)
cdecl
是你的朋友:
$ cdecl explain 'int * (*x) (int * , int * (*)())'
declare x as pointer to function (pointer to int, pointer to function returning pointer to int) returning pointer to int
答案 2 :(得分:2)
嗯...根据cdecl.org这是一个语法错误 - 让我试试
int * (*) (int *,int *(*)())
所以: 它是一个函数指针,它有两个参数,第一个参数是一个指向int的指针,另一个是指向函数的指针,没有参数 - 返回指针指向int,它的返回指针 - 到-INT。
编辑:我在该网站中使用的C声明 - 我没有输入变量名称,如
int *(*x)(int *,int *(*)())
返回: 声明x作为函数的指针(指向int的指针,指向函数的指针返回指向int的指针)返回指向int的指针
希望这有帮助, 最好的祝福, 汤姆。
答案 3 :(得分:1)
有一种称为“左右规则”的技术可以帮助您破译这些复杂的声明。该规则通过将英语关键字替换为声明中出现的属性来工作。然后,当您将关键字放在一起时,构造的句子将描述声明。
以下是您应该使用的属性和关键字:
现在这是“左右规则”:
以下是一些例子:
int n[10];
标识符为n。右侧的属性为[10]
,因此请使用关键字“array of 10”。接下来,您将获得数据类型int
。所以,
n是“10个整数数组”。
int *n[10];
标识符为n。右侧的属性为[10]
,因此请使用关键字“array of 10”。向左看,属性为*
,因此请使用关键字“指向”。没有更多的属性。剩下的就是数据类型,即int
。将关键字放在一起得到:
n是“整数10个指针的数组”。
int (*pf)();
标识符是pf。 pf右边没有属性。 pf的左边是*
。所以第一个关键字是“指向”。接下来,返回右侧,属性为()
。这意味着下一个关键字是“返回的函数”。现在返回左侧的数据类型int
。将关键字放在一起得到:
pf是“指向返回int的函数的指针”
int *(*pf)();
pf是标识符。 pf的权利没有属性。左边是*
,所以第一个关键字是“指向”。返回右侧是()
,因此下一个关键字是“返回的函数”。回到左边是*
,所以下一个关键字是“指向”。接下来,到达int
数据类型:
pf是“指向返回指向int的指针的函数的指针”。
下一个例子和前一个例子一样,但这次有一些pf函数的参数。参数为int *x
和int *(*y)()
。您应该能够基于到目前为止的所有内容来描述每个参数。一旦你这样做,你将能够描述整个事情:
int *(*pf)(int *x, int *(*y)());
pf是一个指向函数的指针,该函数返回一个指向int的指针。 pf有两个参数。第一个参数x是指向int的指针。第二个参数y是一个指向函数的指针,该函数返回一个指向int的指针。
答案 4 :(得分:0)
typedef int* (*fptr)();
int* foo(int* p1, fptr p2);
您可以将foo
放入该类型。
答案 5 :(得分:0)
真的使用了这样的声明!考虑标准C库的信号函数:
void (*
signal(int sig, void (*func)(int)))(int);
信号手册页解释它相当于以下typedef'd版本:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);
一个带有两个args,int和sig_t函数的函数,它返回旧的sig函数。