所以我得到了下面的表达式:
int (*f1(int(*a)(int, int))) (int, int);我试着去理解它,但是它让人迷惑。我发现"a“是一个指向带有两个参数(int,int)的函数的指针。那么f1看起来像是指向另一个接受2个整型参数的函数的指针。但是让我困惑的是f1和a的关系。
有人能给我一些提示或正确地解释上面的表达式是做什么的吗?
发布于 2018-01-13 21:01:17
它将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)发布于 2018-01-13 21:04:49
这是函数f1的声明,它接受一个参数a-一个指向函数的指针,该函数接受2个int作为参数并返回一个int -并返回一个指向相同类型函数的指针。
使用typedef将其分解:
typedef int(*t)(int, int);
t f1(t a); //this is your declaration发布于 2018-01-13 21:54:27
C中的技巧是将声明读作表达式。这就是使C语言优雅的著名的对称性。
如何阅读?遵循运算符优先规则:
如果我取消引用变量a;
(*a)(int,int):,然后用两个integers;
int (*a)(int,int):调用它,那么我会得到一个整数;因此,a是一个指向函数的指针,该函数接受两个整数作为参数,并返回一个int。
然后:
f( int(*a)(int,int) )如果我用参数a;*f( int(*a)(int,int) )调用f,然后取消引用result;(*f( int(*a)(int,int) )(int,int),然后以2 int作为argumentint (*f( int(*a)(int,int) )(int,int)调用这个结果,我会得到一个int所以f是一个以a为参数的函数,返回一个指向以两个int为参数的函数的指针,并返回一个int。因此,f返回类型与其参数返回类型相同。它本可以更简单:
using ftype = int(*)(int,int);
ftype f( ftype a);https://stackoverflow.com/questions/48240050
复制相似问题