在学习Unix网络编程的时候遇到了signal()函数的使用方法,其中该函数的原型定义为:
#include<signal.h>
void (*signal(int signo,void (*func)(int)))(int);
这个函数原型显得相当复杂,为了简化处理,声明了一个函数类型:
typedef void Sigfunc(int);
此时signal的函数原型变为:
Sigfunc *signal(int signo,Sigfunc *func);
这时便可以简单的看出关于signal函数的声明:signal函数包含两个参数,其中第二个参数和函数的返回值都是执行某个特定函数类型的指针。
借此,有关于c语言中函数类型及函数指针类型的用法如下:
声明函数类型
使用typedef声明一个函数类型,这样便可以简化函数的声明,使其更加简便明了,比如开头提到的signal函数的声明。
同时,可以通过声明的函数类型定义一个函数指针变量,将其指向其他同类型的函数并调用,如:
#include<stdio.h>
typedef int Fun(int); //声明一个函数类型
int fun1(int a) {
return a*2;
}
int fun2(int a){
return a*3;
}
int main(){
//Fun fun=fun1;//这种写法是错误的。声明了一个函数,同时将另一个函数赋值给他;
//这相当于声明了一个数组,通过数组名将另一个数组赋值给他 ;
//一个函数名相当于一个常量指针,他的值不可修改。
Fun *fun; //定义一个函数指针,必须是指针类型
fun = fun1; //也可以写为 fun=&fun1
printf("%d\n",fun(2)); //也可以写作 (*fun)(2)
fun=fun2; //函数指针可重新指向其他函数
printf("%d\n",fun(2));
return 0;
}
这种使用方法和声明一个函数指针类型的用法相同。
声明函数指针类型
声明函数指针类型与声明函数类型类似,使函数的定义更加简洁明了。
#include<stdio.h>
typedef int (*Fun)(int); //声明一个函数指针类型
int fun1(int a) {
return a*2;
}
int fun2(int a){
return a*3;
}
int main(){
Fun fun; //定义一个函数指针变量
fun = fun1; //也可以写为 fun=&fun1
printf("%d\n",fun(2)); //也可以写作 (*fun)(2)
fun=fun2; //函数指针可重新指向其他函数
printf("%d\n",fun(2));
return 0;
}
可以直接定义一个函数指针,而不通过声明一个函数指针类型从而定义一个函数指针。
#include<stdio.h>
int fun1(int a) {
return a*2;
}
int fun2(int a){
return a*3;
}
int main(){
int (*fun)(int); //直接定义一个函数指针变量
fun = fun1; //也可以写为 fun=&fun1
printf("%d\n",fun(2)); //也可以写作 (*fun)(2)
fun=fun2; //函数指针可重新指向其他函数
printf("%d\n",fun(2));
return 0;
}