int *(*)(int *,int *(*)())的类型

时间:2010-02-12 16:52:50

标签: c variables pointers types declaration

int *(*)(int *,int *(*)())

我想知道它是什么类型的? ,有人可以举例说明使用这种类型的声明。

任何帮助都会很棒。

感谢。

6 个答案:

答案 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 )() - 指向没有参数的函数的指针,返回指向int
  • 的指针
  • (int *,...) - 两个参数,一个是指向int的指针,另一个是指向函数的指针 - 没有参数 - 返回指针指向
  • (*)(...) - 带参数的函数指针
  • int *(*)(...) - 一个函数指针返回指针指向

所以: 它是一个函数指针,它有两个参数,第一个参数是一个指向int的指针,另一个是指向函数的指针,没有参数 - 返回指针指向int,它的返回指针 - 到-INT。

编辑:我在该网站中使用的C声明 - 我没有输入变量名称,如

int *(*x)(int *,int *(*)())

返回: 声明x作为函数的指针(指向int的指针,指向函数的指针返回指向int的指针)返回指向int的指针

希望这有帮助, 最好的祝福, 汤姆。

答案 3 :(得分:1)

有一种称为“左右规则”的技术可以帮助您破译这些复杂的声明。该规则通过将英语关键字替换为声明中出现的属性来工作。然后,当您将关键字放在一起时,构造的句子将描述声明。

以下是您应该使用的属性和关键字:

  • 当您看到属性“()”时,请使用关键字“返回的功能”
  • 当您看到属性“[n]”时,请使用关键字“array of n”
  • 当您看到属性“*”时,请使用关键字“指向”

现在这是“左右规则”:

  1. 以标识符开头。
  2. 向右查找属性。
  3. 如果找不到,请向左侧看。
  4. 找到属性后,请替换其英语关键字。
  5. 在您解决问题时继续左右替换。
  6. 在声明中到达数据类型时停止。
  7. 以下是一些例子:

    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 *xint *(*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函数。