int * (*) (int * , int * (*)())
我想知道它是什么类型? ,有人可以给出使用这种类型的声明的示例吗?
任何帮助都会很棒。
谢谢。
它是一个指向返回
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
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
嗯...根据 cdecl.org 这是一个语法错误 - 让我试试
int * (*) (int *,int *(*)())
所以: 它是一个函数指针,有两个参数,第一个参数是指向 int 的指针,另一个是无参数返回 int 指针的函数指针,其返回指针到-int。
编辑:我在该网站中使用的 C 声明 - 我没有像
那样输入变量名int *(*x)(int *,int *(*)())
返回: 声明 x 为函数指针(指向 int 的指针,指向返回 int 指针的函数的指针)返回指向 int 的指针
有一种称为“左右规则”的技术可以帮助您破译此类复杂的声明。该规则的工作原理是用英语关键字替换声明中出现的属性。然后,当您将关键字放在一起时,构建的句子将描述声明。
以下是您应该使用的属性和关键字:
现在这是“左右规则”:
这里有一些例子:
int n[10];
标识符是n。右边的属性是
[10]
,所以使用关键字“array of 10”。接下来您将到达数据类型 int
。所以,
n 是“10 个整数的数组”。
int *n[10];
标识符是n。右边的属性是
[10]
,所以使用关键字“array of 10”。向左看,属性是*
,所以使用关键字“pointer to”。没有更多的属性了。剩下的就是数据类型,即 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 的指针。
typedef int* (*fptr)();
int* foo(int* p1, fptr p2);
您可以将
foo
放入该类型中。
这样的声明真有用!考虑标准 C 库的信号函数:
void (*
signal(int sig, void (*func)(int)))(int);
信号手册页解释说它相当于以下类型定义的版本:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);
一个函数,它接受两个参数、一个 int 和一个 sig_t 函数,并返回旧的 sig 函数。