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);  
}