部分转自:https://www.cnblogs.com/zmm1996/p/11752882.htmlhtml
1.函数指针的概念数组
若是在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。并且函数名表示的就是这个地址。既然是地址咱们就能够定义一个指针变量来存放,这个指针变量就叫做函数指针变量,简称函数指针。框架
函数指针的定义方式为:函数返回值类型 (* 指针变量名) (函数参数列表);函数
例以下面语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,因此要有一个“*”,即(*p);其次前面的 int 表示这个指针变量能够指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量能够指向有两个参数且都是 int 型的函数。因此合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量能够指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。spa
int(*p)(int, int);
2.函数指针用法指针
demo1:code
# include <stdio.h> int Max(int, int); //函数声明 int main(void) { int(*p)(int, int); //定义一个函数指针 int a, b, c; p = Max; //把函数Max赋给指针变量p, 使p指向Max函数 printf("please enter a and b:"); scanf("%d%d", &a, &b); c = (*p)(a, b); //经过函数指针调用Max函数 printf("a = %d\nb = %d\nmax = %d\n", a, b, c); return 0; } int Max(int x, int y) //定义Max函数 { int z; if (x > y) { z = x; } else { z = y; } return z; }
输出:htm
please enter a and b:1 2 a = 1 b = 2 max = 2
demo2:blog
#include <stdio.h> #include <string.h> #include <stdlib.h> //任务实现者 int myadd(int a, int b) { printf("func add() do...\n"); return a + b; } int myadd2(int a, int b) { printf("func add2() do...\n"); return a + b; } int myadd3(int a, int b) { printf("func add3() do...\n"); return a + b; } int myadd4(int a, int b) { printf("func add4() do...\n"); return a + b; } typedef int (*MyTypeFuncAdd)(int a, int b); //定义类型 //任务调用者 int MainOp(MyTypeFuncAdd myFuncAdd) { int c = myFuncAdd(5, 6); return c; } int MainOp2(int(*MyPointerFuncAdd)(int a, int b)) { int c = MyPointerFuncAdd(5, 6); return c; } void main() { MyTypeFuncAdd myFuncAdd = myadd; myFuncAdd(3, 4); //间接调用 myadd(1, 2); //直接调用 MainOp2(myFuncAdd); //myFuncAdd MainOp(myFuncAdd); //在mainop框架,不发生变化的状况下,调用后来者的程序 MainOp(myadd2); //传入的是函数的入口地址 MainOp(myadd3); MainOp(myadd4); printf("Hello...\n"); system("pause"); return ; }
输出:get
func add() do... func add() do... func add() do... func add() do... func add2() do... func add3() do... func add4() do... Hello...
3.函数指针数组的概念
既然函数名能够经过函数指针加以保存,那们也必定能定义一个数组保存若干个函数名,这就是函数指针数组。正确使用函数指针数组的前提条件是,这若干个须要经过函数指针数组保存的函数必须有相同的输入、输出值。
首先定义256个处理函数(及其实现)。
void funtion0( void ); …….. void funtion255(void );
其次定义函数指针数组,并给数组赋值。
void (*fun[256])(void); fun[0] = function0; ……. fun[255] = function();
4.函数指针数组用法
#include <stdio.h> #include <string.h> #include <stdlib.h> //任务实现者 int myadd0(int a, int b) { printf("func add0() do...\n"); return a + b; } int myadd1(int a, int b) { printf("func add1() do...\n"); return a + b; } int myadd2(int a, int b) { printf("func add2() do...\n"); return a + b; } int myadd3(int a, int b) { printf("func add3() do...\n"); return a + b; } typedef int (*MyTypeFuncAdd)(int a, int b); //定义类型 MyTypeFuncAdd myFuncAdd[5]; //定义函数指针数组 void main() { MyTypeFuncAdd tmpFuc; int i; memset(myFuncAdd, 0, sizeof(MyTypeFuncAdd) * 5); myFuncAdd[0] = myadd0; myFuncAdd[1] = myadd1; myFuncAdd[2] = myadd2; myFuncAdd[3] = myadd3; for(i = 0; i < 5; i++) { tmpFuc = myFuncAdd[i]; if(tmpFuc == NULL) { continue; } tmpFuc(1, 2); } printf("Hello...\n"); system("pause"); return ; }
输出:
func add0() do... func add1() do... func add2() do... func add3() do... Hello...