最近在看《c陷阱与缺陷》这本书 第一张就介绍了函数声明,才知道函数指针可以声明,怎么样声明。
首先 typedef 书上的用法就是,用声明表达式的标识符作为其标识符类型对应的别名。
例如
typedef int a;
/*
此时a就是int 类型的别名
*/
typedef char fuc[10];
/*
fuc 代表一个长度为10的字符数组名(字符指针)类型
*/
typedef void (*fp)(int);
/*
fp 代表一个函数指针,该指针指向的函数为 返回值为void,参数为一int类型的函数;
*/
其中书上有一个例子
一个signal函数, signal函数接受两个参数一个代表需要"被捕获"的特定signal的整数值,另一个是指向用户提供的函数指针,该函数用于处理“捕获到”的特定signal,返回值类型为void ,signal函数返回值为函数指针该函数指针类型与第二个参数相同。
如果要直接声明
void (*signal(int ,void(*)(int)))(int);
大部分程序员都这段代码就很费劲了。
如果用typedef就很容易明白了
typedef void (*fp)(int);
fp signal(int,fp);
最后几个c函数的特殊方面
1.func是个函数名,func的值是函数的地址,&func的值也为函数地址;(*func)(something)为调用对应函数,(*(&func))(something)调用对应的函数,但一般都倾向于用二种写法,符合普通指针的定义。
2.任何变量使用前都需要声明,包括函数。
3. c语言要求:在函数调用时即使不带参数,也应该包括参数列表,因此如果f是一个函数。
f();
是一个函数调用语句,而
f;
却是一个什么都不做的语句,更精确的说,这个语句计算函数f的地址,却并不调用该函数。