INT *(*)的为(int *,诠释*(*)())类型为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
typedef int* (*fptr)();
int* foo(int* p1, fptr p2);
你可以把foo
在这个类型。
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]
,所以使用关键字“10的数组”。接下来你到达数据类型int
。所以,
n是一个“10个整数数组”。
int *n[10];
该标识符是n。右边的属性是[10]
,所以使用关键字“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的指针的函数的指针。
这样的声明真的被使用!考虑标准C库的信号功能:
void (*
signal(int sig, void (*func)(int)))(int);
信号手册页解释了它等同于以下typedef定义版本:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);
是有两个参数的函数,int和一个sig_t函数,并返回旧的sig函数。
甚至哪种语言? C++? – 2010-02-12 16:56:43
我猜测它是C并将其标记为这样。 – 2010-02-12 16:57:49
哇,这是相当虐待... – 2010-02-12 17:02:00