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

问题描述 投票:0回答:6

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

我想知道它是什么类型? ,有人可以给出使用这种类型的声明的示例吗?

任何帮助都会很棒。

谢谢。

c variables pointers types declaration
6个回答
21
投票

它是一个指向返回

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

10
投票

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

3
投票

嗯...根据 cdecl.org 这是一个语法错误 - 让我试试

int * (*) (int *,int *(*)())
  • (int , int ()()) - 最里面 ()() - 函数指针 int ()() - 指向无参数函数的指针,返回指向 int
  • 的指针
  • (int *, ...) - 两个参数,一个是指向 int 的指针,另一个是无参数返回 int 指针的函数指针
  • (*)(...) - 带有参数的函数指针
  • int * (*)(...) - 返回 int 指针的函数指针

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

编辑:我在该网站中使用的 C 声明 - 我没有像

那样输入变量名
int *(*x)(int *,int *(*)())

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


2
投票

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

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

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

现在这是“左右规则”:

  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”。向左看,属性是
*
,所以使用关键字“pointer to”。没有更多的属性了。剩下的就是数据类型,即
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 的指针。


0
投票
typedef int* (*fptr)();    
int* foo(int* p1, fptr p2);

您可以将

foo
放入该类型中。


0
投票

这样的声明真有用!考虑标准 C 库的信号函数:

void (*
     signal(int sig, void (*func)(int)))(int);

信号手册页解释说它相当于以下类型定义的版本:

typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);

一个函数,它接受两个参数、一个 int 和一个 sig_t 函数,并返回旧的 sig 函数。

© www.soinside.com 2019 - 2024. All rights reserved.