求解释c语言函数指针的作用
发布网友
发布时间:2022-04-23 09:42
我来回答
共3个回答
热心网友
时间:2022-06-23 15:28
上面的话是有道理的。只是,要真的体会这些名词,需要你亲历躬行,一个“百度知道”是很难让你真正体会并理解的。国人一些教科书也不负责任,人云亦云的说这些话,但很少能透彻讲解。我小试一下。
1. 便于分层设计:函数指针是引用,是间接层,或曰隔离层。它输出到上层,给上层用户用。函数实体是实现,在下层,给开发者用,实现者(软件工程师)关注。这就是简单的分层的概念了。上层用户想让一个函数所做的东西会变化时,我们只需要改变底层实现,并用函数指针指向新的实现就行了。
再精炼一下分层:分层的核心是对接口进行设计和实现。函数指针的作用就是提供不同实现的统一接口。
2. 利于系统抽象:只有存在多个类似的实体需要模拟、操作或控制时(这种情况很多)才需要抽象。多个类似的实体就是对象,抽象的结果就是类。在C里边,可以用函数指针数组完成这种抽象。如, fopen 就是一个例子。他可以打开文件。C里面将磁盘文件、串口、USB等诸多设备抽象为文件。
3. 降低耦合度以及使接口与实现分开:第1条中的解释已经说明了这一点。
再具体一下:
我曾搭建过一个嵌入式平台。其中的设备操作(硬件驱动)采用了多组函数指针数据,并进行了简单的封装,其结果是:
业务软件使用函数指针数组的封装函数访问设备。这个封装可展示为:
int DevOpen(char *strDevName);
int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong);
int Read(int DevID, char* DataTo, int StartDevAddr, int DataLong);
int DevClose(int DevID);
这组抽象出来的函数,是一组语义清晰且稳定的上层接口,为上层的业务开发团队使用。底层的驱动层,各自实现自己的设备打开、读、写及关闭代码,然后,注册自己的设备到系统列表里。上层业务接可以使用了。期间的耦合在这里:
int Write(int DevID, char* DataFrom, int StartDevAddr, int DataLong)
{
/* Error detecting. */
return DevWrite[ DevID ]( char* DataFrom, int StartDevAddr, int DataLong );
}
其中,DevWrite[ DevID ]就是一个函数指针数组:
int (*DevWrite)[ MAX_DEV_NUM ]( char*,int,int ) = {0};
里面放的就是多个设备的写的操作。其中包括:UART,RTC,WatchDog。EEPROM,DigitalInput,DigitalOutput,Key,LCD,LED。
好了。说的太多了。如需要学习,可邮件livefuture@163.com。
但愿对你有所帮助。
热心网友
时间:2022-06-23 16:46
你上面那一段话,对于初学者来说确实坑爹,说的像什么官方话语,我看着也就只能理解个模糊大概。
先给你举个例子吧,函数指针的写法
int *p;
int a;
p=&a; //这是一般整型指针
#include <iostream>
using namespace std;
int arr(int a,int b){return 0;}//比如说是函数1
int brr(int a,int b){return 1;}//比如说是函数2
int main()
{
int (*frr)(int,int); //这里就是函数指针
frr =arr; //它可以指向arr
cout<<frr(1,2)<<endl;
frr=brr;//也可以指向brr,只需要改改指向的对象,就可以操作不同的函数
cout<<frr(1,2)<<endl;
return 0;
}
热心网友
时间:2022-06-23 18:20
好吧,假设你已经知道函数指针的写法和用法。
那么那段话的意思就是, 你有了一只手,可以用来装备并切换武器打怪,比如可以装备刀子,或者装备棍子。当你的武器只有一种或者比较少的时候,可能这只手切换武器的功能不常用到。当到了后期,你的武器多了,那你因为有了这只能装备并切换武器的手,而可以更有效率的打怪。
OVER