函数指针表达式

时间:2018-01-13 12:53:55

标签: c++ pointers

所以我有以下表达式:

int (*f1(int(*a)(int, int))) (int, int);

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

有人可以给我一些提示或正确解释上述表达方式的作用吗?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:6)

这是函数public class App { public static void main( String[] args ) { SessionFactory sessionFactory = HibernateAnnotationUtil.getSessionFactory(); Session session = sessionFactory.openSession(); System.out.println("Session created"); Transaction tx = session.beginTransaction(); User user = new User(); user.setFirthName("Igor"); user.setLastName("Petrenko"); user.setNickName("6ruceVVayne"); user.setToken("somethink"); user.setRole(Role.ADMINISTRATOR); session.save(user); tx.commit(); System.out.println("User ID=" + user.getId()); } } 的声明,它接受一个参数f1 - 一个指向函数的指针,它将2 a s作为参数并返回int - 和返回指向同一类型函数的指针。

使用typedef打破它:

int

答案 2 :(得分:4)

af1唯一参数的名称;当你删除它时,你可以使用https://cdecl.org/来破译整个声明:

  

将f1声明为函数(指向函数(int,int)的指针返回int)   返回指向函数(int,int)的指针返回int

所以f1是一个功能。它需要一个函数指针(称为a)并返回一个函数指针。

这两个函数指针都适用于需要两个int并返回int的函数。

以下是一个实际操作示例:

#include <iostream>

int passed(int x, int y) { std::cout << "passed\n"; return x * y; }
int returned(int x, int y) { std::cout << "returned\n"; return x + y; }

// a is redundant here, where we just declare f1:
int (*f1(int(*a)(int, int))) (int, int);

// but not here, where we define f1:
int (*f1(int(*a)(int, int))) (int, int)
{
    std::cout << "f1\n";
    int result_of_passed = a(10, 10);
    std::cout << result_of_passed << '\n';
    return returned;
}

int main()
{
    int x = f1(passed)(10, 10);
    std::cout << x << '\n';
}

输出:

f1
passed
100
returned
20

答案 3 :(得分:4)

C中的提示是读取一个声明,因为它是一个表达式。这就是这种着名的对称性,使C优雅。

如何阅读?遵循运营商优先规则:

  1. *a:如果我取消引用变量a;
  2. (*a)(int,int):然后用两个整数调用它;
  3. int (*a)(int,int):然后我得到一个整数;
  4. 所以a是一个指向函数的指针,该函数将两个int作为参数并返回一个int。

    然后:

    1. f( int(*a)(int,int) )如果我使用参数a;
    2. 调用f
    3. *f( int(*a)(int,int) )然后我取消引用结果;
    4. (*f( int(*a)(int,int) )(int,int)然后使用2 int作为参数调用此结果
    5. int (*f( int(*a)(int,int) )(int,int)我收到int
    6. 所以f是一个以a为参数的函数,并返回一个指向函数的指针,该函数将两个int作为参数并返回int。所以f返回类型与其参数返回类型相同。它可能更简单:

      using ftype = int(*)(int,int);
      ftype f( ftype a);