c函数指针数组
Posted BHY_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c函数指针数组相关的知识,希望对你有一定的参考价值。
部分转自:https://www.cnblogs.com/zmm1996/p/11752882.html
1.函数指针的概念
如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。
函数指针的定义方式为:函数返回值类型 (* 指针变量名) (函数参数列表);
例如下面语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。
int(*p)(int, int);
2.函数指针用法
demo1:
# 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;
输出:
please enter a and b:1 2
a = 1
b = 2
max = 2
demo2:
#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 ;
输出:
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...
以上是关于c函数指针数组的主要内容,如果未能解决你的问题,请参考以下文章