http://c.biancheng.net/cpp/html/496.html
1. 快照:

2. 函数定义的一般形式:
return_type function_name( parameter list )
{
body of the function
}
其中,如果没有返回值则return_type处应填void
如果没有声明函数,则定义函数应在调用前
如果有声明函数,则定义函数可在调用后
3. 函数声明:
函数声明会告诉编译器函数名称及如何调用函数。
函数声明应在函数调用前
函数声明之后定义函数放在那都没问题
函数声明可以忽略形参,如int Fun(int , int);
return_type function_name( parameter list );
4. 声明函数指针变量:
类似于函数声明。因为时变量,所以只有声明,没有定义。就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函数了。在C系列语言中,任何一个变量,总是要先声明,之后才能使用的。
void (FunP)(int) ; / 也可写成void (FunP)(int x)/
5. 通过函数指针变量调用函数:
设定义了一个函数指针变量FunP对它赋值指向MyFun,然后通过FunP来调用MyFun函数。
MyFun(10); /* 这是直接调用MyFun函数 */
FunP = &MyFun; /* 将MyFun函数的地址赋给FunP变量 */
(FunP)(20); / 这是通过函数指针变量FunP来调用MyFun函数的。 */
其中,函数名其实本质上是一个函数指针常量
C语言允许MyFun(10)这种形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。
为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。
赋值时,即可FunP = &MyFun形式,也可FunP = MyFun。
6. 定义某一函数的指针类型:
首先,在void (*FunType)(int)前加了一个typedef 。这样只是定义一个名为FunType函数指针类型,而不是一个FunType变量。
然后,“FunType FunP;”这句就如“int a;”一样地声明一个FunP函数指针变量。
7. 函数指针作为某个函数的参数
既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。
如:
void MyFun1(int x);
void MyFun2(int x);
typedef void (*FunType)(int ); /* 定义一个函数指针类型FunType,与MyFun1函数类型一致 */
void CallMyFun(FunType fp,int x);
void CallMyFun(FunType fp,int x) /* ③. 参数fp的类型是FunType。*/
{
fp(x);/* 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的。 */
}
int main(int argc, char* argv[])
{
CallMyFun(MyFun1,10); /* 通过CallMyFun函数分别调用两个不同的函数 */
CallMyFun(MyFun2,20);
}