【c】函数指针数组

部分转自: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...