定义:函数指针是指指向函数的指针。像其他指针一样,函数指针也指向特定的类型。函数类型由其返回值以及形参表确定,而与函数名无关。
e.g
void (*pf) ( char,int );
这个语句将pf声明指向函数的指针,它所指向的函数带有一个char类型,一个int类型,返回类型为void
我们可以这样理解:我们怎么定义普通的指针呢,如我们定义一个int型的指针,
int *p;
是在变量声明前面加*,即p前面加上*号。而我们定义函数指针要在函数声明前加*, 函数声明为
void pf( char,int );
函数声明前加*后变成
void *pf(char,int);
我们把*pf用小括号括起来,变成
void (*pf) ( char,int ); 这就是函数指针的声明方法
测试代码如下:
#include"stdio.h"
void (*pf)(char, int);
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
函数运行后的结果是
The argumeng is c and 90
函数指针类型相当地冗长。使用typedef为指针类型定义同义词,可将函数指针的使用大大简化
typedef void (*FCN) (char,int);
记忆方法:在函数指针声明 void (*FCN)(char,int)前加上typedef关键字就是函数指针类型的声明。
该定义表示FCN是一种函数指针类型。该函数指针类型表示这样一类函数指针:
指向返回void类型并带有一个char类型,一个int类型的函数指针。
测试代码如下:
#include"stdio.h"
typedef void (*FCN)(char, int); //声明一个函数指针类型
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
FCN pf;
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
函数类型的定义:
typedef void (*FCN)(char, int); //声明一个函数类型
该声明定义了一个函数类型,FCN表示这样一类函数,带有两个形参,一个是int ,一个是char,返回值是void型。一般用于函数声明和函数的形参。
一般我们在调用函数时,应该先声明要调用函数,如我们调用fun函数,则应在调用的前面声明void fun(char ,int);
如果我们定义了函数类型typedef void FCN(char , int);我们就可以这样声明函数原形,
FCN fun;
大大简化了函数原型的声明,函数类型用于形参的情况我们在下面讲解。
#include"stdio.h"
typedef void FCN(char , int);
int main()
{ FCN fun;
fun('c',90);
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用操作符,直接通过指针调用此函数。
void (*pf)(char, int);
pf=fun;
两种调用方法
(*pf)('c',90); // 显式调用
pf(‘c’,90); // 隐式调用
测试代码如下:
#include"stdio.h"
void (*pf)(char, int); //声明一个函数指针,它所指向的函数形参带有一个char类型,一个int类型,返回类型为void
void fun(char ,int); //声明一个函数,形参为一个char类型,一个int类型,返回类型为void
int main()
{
pf=fun; //给函数指针pf赋值为fun函数的地址(函数名代表函数的地址)
(*pf)('c',90); //调用pf指向的函数
Pf(‘a’,80);
}
void fun(char a,int b)
{
printf("the argument is %c and %dn",a,b);
}
函数可以返回指向函数的指针,但是,正确写出这种返回类型相当不容易:
int (*ff(int))(int*,int);
要理解函数指针声明的最佳方法是从声明的名字开始由里而外理解。要理解该声明的含义,首先观察:
ff(int)
将ff声明为一个函数,它带领有一个int 型的形参。该函数返回
int (*)(int*,int);
它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是int *型和int型的形参。
使用typedef可使该定义更简明易懂:
typedef int (*PF)(int *,int);
PF ff(int);
允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不能是函数。
具有函数类型的形参所对应的将被自动转换为指向相应函数类型的指针。但是,当返回的是函数时,同样的转换操作则无法实现,
//func is a function type,not a pointer to function!
typedef int func(int*,int)
void f1(func); //ok: f1 has a parameter of function type
func f2(int) ;//error: f2 has a return type of function type
func * f3(int);//ok: f3 return a pointer to function type