函数指针表达式

Die*_*iez 11 c++ pointers

所以我有以下表达式:

int (*f1(int(*a)(int, int))) (int, int);
Run Code Online (Sandbox Code Playgroud)

而我正试图理解它,但它令人困惑.我发现"a"是一个指向函数的指针,它接受2个参数(int,int).然后f1似乎是另一个带有2个int参数的函数的指针.但令我困惑的是f1与a的关系.

有人可以给我一些提示或正确解释上面的表达是做什么的吗?

Hol*_*Cat 10

它声明f1为一个带有单个参数的函数a.参数和返回类型的类型都是"指向int返回两个参数的函数的指针int".


这是你解析它的方式:

// f1 is...
      f1
// ...a function...
      f1(                 )
// ...with a single parameter called `a`, which is...
      f1(     a           )
// ...a pointer to...
      f1(    *a           )
// (skip parentheses)
      f1(   (*a)          )
// ...a function...
      f1(   (*a)(        ))
// ...with two `int` parameters...
      f1(   (*a)(int, int))
// ...returning an `int`. The `f1` itself returns...
      f1(int(*a)(int, int))
// ...a pointer to...
     *f1(int(*a)(int, int))
// (skip parentheses)
    (*f1(int(*a)(int, int)))
// ...a function...
    (*f1(int(*a)(int, int))) (        )
// ...with two int parameters...
    (*f1(int(*a)(int, int))) (int, int)
// ...returning an `int`.
int (*f1(int(*a)(int, int))) (int, int)
Run Code Online (Sandbox Code Playgroud)


mda*_*sev 6

这是函数的声明,f1它接受一个参数a- 一个指向函数的指针,该函数以2 ints作为参数并返回int- 并返回指向同一类型函数的指针.

用typedef打破它:

typedef int(*t)(int, int);

t f1(t a); //this is your declaration
Run Code Online (Sandbox Code Playgroud)


Oli*_*liv 5

C 中的技巧是将声明当作表达式来阅读。这就是使 C 变得优雅的著名对称性。

如何阅读?遵循运算符优先规则:

  1. *a:如果我取消引用变量a
  2. (*a)(int,int): 然后用两个整数调用它;
  3. int (*a)(int,int): 然后我得到一个整数;

a指向以两个ints 作为参数并返回一个 int的函数的指针也是如此。

然后:

  1. f( int(*a)(int,int) )如果我用参数调用 f a
  2. *f( int(*a)(int,int) ) 然后我取消引用结果;
  3. (*f( int(*a)(int,int) )(int,int)然后用 2int作为参数调用这个结果
  4. int (*f( int(*a)(int,int) )(int,int) 我得到一个 int

所以f是一个函数获取a作为参数,并返回一个指向一个函数,需要两个intS作为参数,并返回一个int。因此f返回类型与其参数返回类型相同。它本来可以更简单:

using ftype = int(*)(int,int);
ftype f( ftype a);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,C++ 使用引用扩展此 C 语法的方式似乎并不遵循此模式。例如,`int &x;` 将`x` 声明为对`int` 的引用,但这并不意味着`&x` 具有类型`int`(它实际上具有类型`int*`)。因此,仅当您的声明中没有引用时,这才是正确的。 (2认同)