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函数指针数组的主要内容,如果未能解决你的问题,请参考以下文章

c 数组与指针的使用注意事项

通过C中的void函数返回动态数组

C语言函数指针,敲黑白,讲重点,如何定义函数指针?

梦开始的地方 —— C语言: 函数指针+函数指针数组+指向函数指针数组的指针

C语言【函数 数组 指针】利用指针求一维数组的数据元素之和

C语言数组指针函数指针函数指针数组