C语言中的函数指针

本文深入讲解函数指针的概念、定义及应用,包括基本语法、如何使用typedef简化定义,以及函数指针作为函数参数的应用场景。

函数指针用于指向一个函数

函数名是函数体的入口地址

<span style="font-size:14px;">//函数指针语法梳理
//1 如何定义一个函数类型
//2 如何定义一个函数指针类型
//3 如何定义一个 函数指针  (指向一个函数的入口地址)

int add(int a, int b)
{
	printf("func add ....\n");
	return a +b;
}

void main()
{
	add(1, 2); //直接调用调用 //函数名就是函数的入口地址 

	//定义一个函数类型
	{
		typedef int (MyFuncType)(int a, int b); //定义了一个类型
		MyFuncType *myPointerFunc = NULL; //定义了一个指针, 指向某一种类的函数..

		myPointerFunc  = &add;  //细节
		myPointerFunc(3, 4); //间接调用

		myPointerFunc  = add;  //细节 //C 过程 兼容历史版本的原因
		myPointerFunc(3, 4); //间接调用
	}

	//定义一个函数指针类型
	{
		typedef int (*MyPointerFuncType)(int a, int b); //int * a = NULL;
		MyPointerFuncType myPonterFunc; //定义一个指针
		myPonterFunc = add;
		myPonterFunc(5, 6);
	}

	//函数指针 
	{
		int (*MyPonterFunc)(int a, int b); //定义了一个变量
		MyPonterFunc = add;
		MyPonterFunc(7, 8);

	}


	system("pause");
}</span>


定义一个函数指针的基本语法格式是:

函数类型 (*指针变量名)(函数形参表)


//此时已经定义了一个指向函数的指针变量,指针变量名为Add

例如: int  (*Add)(int a,int b);

但是如果用来做函数参数,或者这个函数参数比较多,这样用来定义函数指针变量,就比较繁琐,比较长。

那有没有办法可以简化一点操作呢,有的,那就是用typedef 关键字,重新定义一个新类型,简化我们的定义


那用typedef,如何定义一个函数指针类型?  其实很简单,就是前面加个typedef 

就变成:typedef   int  (*MyTypeFuncAdd) (int a, int b);//其中MyTypeFuncAdd这里的名字随便你取,只是告诉你以后可以用这个类型//的名字,去定义变量。

不过要注意这里定义的只是新的类型,是类型!类型!类型!而不是定义了变量,定义了一种新的类型,它的类型名字取为MyTypeFuncAdd,但是这种类型比较特殊,它是指向某种函数的指针,这种函数以两个int为参数,并返回int类型。


那么以后我们可以这样定义 函数指针的变量啦!例如:MyTypeFuncAdd my1;

那么怎么使用呢? 只需将我们需要被调用的函数,赋值给my1 就可以,假设我们已经定义一个myAdd函数()

my1 = myAdd;//这里需要注意的是,因为我们现在通过函数指针去调用函数,因此只需要把函数名赋值给my1即可,因为

函数名就代表函数体的入口地址。


#include <iostream>
using namespace std;

int myAdd(int a, int b)
{
	cout << "myAdd函数中的加法结果:  " << (a+b) << endl;
 
	return a+b;
}
//定义一个函数指针类型,是类型 类似于int*,char* 这样。是类型,还没有具体的变量
//因为使用了typedef,所以定义的只是类型,并不是变量,1意思说
//定义了一种叫 MyTypeFuncAdd的类型,并定义这种类型为  指向某种函数的指针,这种函数以两个int为参数,并返回int类型。
typedef int (*MyTypeFuncAdd)(int a, int b);

//然后我们可以用这种叫MyTypeFuncAdd的类型,定义变量,并且用来做函数的参数
int MainOp(MyTypeFuncAdd myFuncAdd)
{
	int c = myFuncAdd(5,6);//间接调用;实参(5,6)调用myFuncAdd所指向的函数==》myAdd函数
	return c;
}
int main()
{
	MainOp(myAdd);//只需将函数名(函数的入口地址)作为实参传递给 形参myFuncAdd
	
	system("pause");
	return 0;
}


那么函数指针做函数参数,有什么好处呢?  这样就可以把任务的调用者 如(MainOp(myAdd))

和任务的实现者 分开(解耦合) 


那么函数指针类型做了什么工作? 函数指针(回调函数)的本质就是: 

提前做了一个协议的约定(把函数的参数,函数返回值提前约定好)




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值