[英]type of int * (*) (int * , int * (*)())
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”。 向左看,属性是*
所以使用关键字“指向”。 没有更多的属性。 剩下的就是数据类型,即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'd版本:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);
一个函数,它接受两个args,int和一个sig_t函数,并返回旧的sig函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.