int * (*) (int *,int * (*)())
我想知道它是什么类型?,谁能给出一个使用这个类型的声明的例子。
任何帮助都是最好的。
谢谢。
发布于 2010-02-13 00:54:50
它是一个指向返回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
发布于 2010-02-13 01:01:00
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
发布于 2010-02-13 05:01:43
有一种技术叫做“右-左规则”,它可以帮助你破译像这样的复杂声明。该规则的工作方式是用英语关键字替换声明中出现的属性。然后,当您将关键字放在一起时,构造的句子将描述声明。
以下是您应该使用的属性和关键字:
下面是“左-右规则”:
如果未找到,请从右侧的identifier.
中的数据类型时,
下面是一些示例:
int n[10];
标识符是n。右边的属性是数组,所以使用关键字“[10]
of 10”。接下来,您将看到数据类型int
。所以,
N是一个“10个整数的数组”。
int *n[10];
标识符是n。右边的属性是数组,所以使用关键字“[10]
of 10”。向左看,属性是*
,所以使用关键字"pointer to“。没有更多的属性。剩下的就是数据类型,即int
。将关键字放在一起得到:
N是“指向整数的10个指针的数组”。
int (*pf)();
标识符是pf。在pf的右边没有属性。pf的左边是*
。所以第一个关键字是"pointer to“。接下来,回到右边,该属性为()
。这意味着下一个关键字是“返回的函数”。现在回到左边,返回到数据类型int
。将关键字放在一起得到:
pf是一个“指向返回int的函数的指针”。
int *(*pf)();
pf是标识符。pf的右边没有属性。左边是*
,所以第一个关键字是"pointer to“。回到右边是()
,所以下一个关键字是“返回的函数”。回到左边是*
,所以下一个关键字是"pointer to“。接下来,转到int
数据类型:
pf是一个“指向函数的指针,该函数返回指向int的指针”。
下一个示例与上一个示例类似,但这次pf函数有一些参数。参数是int *x
和int *(*y)()
。到目前为止,您应该能够根据所有内容来描述这些论点。一旦你这样做了,你就能够描述整个事情:
int *(*pf)(int *x, int *(*y)());
pf是一个指向函数的指针,该函数返回一个指向int的指针。pf有两个参数。第一个参数x是一个指向int的指针。第二个参数y是一个指向函数的指针,该函数返回一个指向int的指针。
https://stackoverflow.com/questions/2253509
复制相似问题