一、指向函数的指针的声明
有函数void MyFun(int);
声明void (*FunP)(int);则指针FuP可以指向函数MyFun(),也可以指向具有相同参数以及返回值的函数。
二、通过指针调用函数
代码一:
/* 自行包含头文件 */
void MyFun(int x); /* 这个声明也可写成:void MyFun( int )*/
void (*FunP)(int ); /*也可声明成 void(*FunP)(int x),但习惯上一般不这样。 */
int main(int argc, char* argv[])
{
MyFun(10); /* 这是直接调用 MyFun 函数 */
FunP = &MyFun; /* 将 MyFun 函数的地址赋给 FunP 变量 */
(*FunP)(20); /* (★)这是通过函数指针变量FunP 来调用MyFun 函数的。 */
return 0;
}
void MyFun(int x) /* 这里定义一个MyFun 函数 */
{
printf("%d\n",x);
}
函数 MyFun 好像是一个如 int 的变量(或常量) ,而FunP 则像一个如 int * 一样的指针变量。
代码二:
红色部分改为:
FunP = MyFun; /* 将 MyFun 函数的地址赋给 FunP 变量 */
FunP(20); /* (★)这是通过函数指针变量来调用 MyFun 函数的。*/
运行试试,啊!一样地成功。
咦?
FunP = MyFun;
总结
1. MyFun 函数名是一个函数指针常量,而 FunP 是一个函数数指针变量。
2. 函数名调用如果都得如(*MyFun)(10)这样,那书写与读起来都是不方便和不习惯的。所以C 语言的设计者们才会设计成又可允许 MyFun(10)这种形式地调用。调用时函数时MyFun();(*MyFun)();FunP();(*FunP)();是一样的。
3. 为统一起见,FunP 函数指针变量也可以 FunP(10)的形式来调用。
4. 赋值时,即可 FunP = &MyFun 形式,也可 FunP = MyFun。