1、函数指针
e.g
这个语句将pf声明指向函数的指针,它所指向的函数带有一个char类型,一个int类型,返回类型为void
我们可以这样理解:我们怎么定义普通的指针呢,如我们定义一个int型的指针,
是在变量声明前面加*,即p前面加上*号。而我们定义函数指针要在函数声明前加*, 函数声明为
函数声明前加*后变成
我们把*pf用小括号括起来,变成
测试代码如下:
#include"stdio.h"
void (*pf)(char, int);
void fun(char ,int);
int main()
{
}
void fun(char a,int b)
{
}
函数运行后的结果是
2、函数指针类型
typedef
该定义表示FCN是一种函数指针类型。该函数指针类型表示这样一类函数指针:
指向返回void类型并带有一个char类型,一个int类型的函数指针。
测试代码如下:
#include"stdio.h"
typedef void (*FCN)(char, int);
void fun(char ,int);
int main()
{
}
void fun(char a,int b)
{
}
3、函数类型
函数类型的定义:
该声明定义了一个函数类型,FCN表示这样一类函数,带有两个形参,一个是int ,一个是char,返回值是void型。一般用于函数声明和函数的形参。
#include"stdio.h"
typedef void FCN(char , int);
int main()
{ FCN fun;
}
void fun(char a,int b)
{
}
4、通过指针调用函数
两种调用方法
测试代码如下:
#include"stdio.h"
void (*pf)(char, int); //声明一个函数指针,它所指向的函数形参带有一个char类型,一个int类型,返回类型为void
void fun(char ,int);
int main()
{
}
void fun(char a,int b)
{
}
5、返回指向函数的指针
函数可以返回指向函数的指针,但是,正确写出这种返回类型相当不容易:
int (*ff(int))(int*,int);
要理解函数指针声明的最佳方法是从声明的名字开始由里而外理解。要理解该声明的含义,首先观察:
ff(int)
将ff声明为一个函数,它带领有一个int 型的形参。该函数返回
int (*)(int*,int);
它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是int *型和int型的形参。
使用typedef可使该定义更简明易懂:
typedef int (*PF)(int *,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