考虑声明
char first (int (*) (char, float)) ;
int second(char, float);
以下哪项函数调用有效?
A)first (*second);
B)first (&second);
C)first (second);
D)以上都不是
任何人都可以解释一下这段代码吗?
答案 0 :(得分:3)
这三个电话都有效。
根据C标准(6.3.2.1 Lvalues,数组和函数指示符)
4函数指示符是具有函数类型的表达式。 除非它是sizeof operator65)或一元&的操作数。 operator,一个函数指示符,类型为''函数返回类型'' 转换为具有类型''指向函数的指针的表达式 返回类型''
此外你甚至可以写
first( ******second );
这是在表达式中使用的函数指示符被隐式转换为指向函数本身的指针,除了事实上它被用作&的操作数的一种情况。运算符,其中函数的地址是明确的。
这是一个示范程序
#include <stdio.h>
void g( void ( *f )( void ))
{
f();
}
void f( void )
{
puts( "Hello!" );
}
int main( void )
{
g( **********f );
return 0;
}
它的输出是
Hello!
考虑到函数first
也可以声明为
char first (int (char, float)) ;
具有函数类型的函数参数被隐式调整为指向函数的指针。