为了让这些声明更清晰
void (*pfs)(void)=&fs;
long int (*pfact)(int)=&fact;
您可以为函数声明引入 typedef 名称,例如
typedef void FUNC1( void );
typedef long int FUNC2( int );
然后写
FUNC1 *pfs = &fs;
FUNC2 *pfact = &fact;
所以原始声明声明了指向指定类型函数的指针,并用给定函数的地址初始化它们。
这是一个演示程序
#include <stdio.h>
typedef void FUNC1( void );
typedef long int FUNC2( int );
void fs( void )
{
puts( "Hello Islacine" );
}
long int fact( int x )
{
return x;
}
int main(void)
{
FUNC1 *pfs = &fs;
FUNC2 *pfact = &fact;
pfs();
printf( "sizeof( long int ) = %zu\n", sizeof( pfact( 0 ) ) );
return 0;
}
它的输出可能看起来像
Hello Islacine
sizeof( long int ) = 8
考虑到,而不是
FUNC1 *pfs = &fs;
FUNC2 *pfact = &fact;
或代替
void (*pfs)(void)=&fs;
long int (*pfact)(int)=&fact;
你甚至可以写
FUNC1 *pfs = fs;
FUNC2 *pfact = fact;
或
void (*pfs)(void) = fs;
long int (*pfact)(int) = fact;
因为在极少数例外的表达式中,函数指示符被转换为指向函数的指针。
你甚至可以写:)
FUNC1 *pfs = *****fs;
FUNC2 *pfact = *****fact;
或
void (*pfs)(void) = *****fs;
long int (*pfact)(int) = *****fact;
来自 C 标准(6.3.2.1 左值、数组和函数指示符)
4 函数指示符是具有函数类型的表达式。
除非它是 sizeof operator65) 的操作数或一元 &
运算符,类型为“函数返回类型”的函数指示符
转换为具有“函数指针”类型的表达式
返回类型''。