繁体   English   中英

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

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

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

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

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

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

希望这会有所帮助,最好的问候,汤姆。

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

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

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

现在这是“左右规则”:

  1. 从标识符开始。
  2. 向右查找属性。
  3. 如果没有找到,请向左看。
  4. 找到属性后,替换其英语关键字。
  5. 当你解决问题时,继续左右替换。
  6. 在到达声明中的数据类型时停止。

以下是一些例子:

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的指针的函数的指针。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM