问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求解释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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我这个配置能玩大唐无双2吗 PK什么的能卡么? 求高手解答 这样的配置还要加什么玩大唐无双才不卡 这个配置能玩大唐无双双开吗? windows7旗舰版系统玩大唐无双零双开卡怎么办?卡死了。 玩大唐无双的时候双开过地图太卡怎么解决啊 全民枪战我用QQ号,但它说密码数字英文,下划线组成,应该怎样弄啊?_百 ... 小太阳取暖器头晕呕吐 取暖器用的会头晕吗,可能的原因和使用注意事项 男孩姓孙含越字好名字 简单特别的男孩名字越 中间是越的男孩名字大全 什么是apostille,哪些文件可以办理海牙认证 《冷冷的夜里被风吹,找不到人安慰;当初的誓言太完美,让相思化成灰。》请问这首歌的歌名叫什么。 C语言函数指针定义法 国家征收农民土地怎么赔偿 海牙认证(apostille认证)是什么意思 C语言函数指针定义 落花歌词林心如 c语言的函数指针举个例子 个人土地如果被国家征收怎么赔偿 什么是海牙认证? 复磷酸盐(又叫:硅磷晶、硅丽晶)能阻止水垢形成吗?对人体健康是否有害? C语言中,指针函数和函数指针有什么区别? 有首歌里歌词是“冷冷的夜里面北风吹,才知道离别的滋味”,是什么歌 有机硅皮革怎么区别好坏? c语言指针函数 关于C语言函数指针的问题? 有一首歌的歌词叫冷冷的夜冷不过这份情,暖暖的泪暖不过冷冷的心,你的心`我的 C语言中的函数指针 c语言中函数指针是什么 有什么用 举个实例 “冷冷的夜里北风吹,找不到人来陪。”是什么歌? c语言中函数名就是一个指针吗 郭富城的《天涯》 歌词 国家征收土地到底每亩要赔偿多少钱 西班牙的海牙认证是什么? c语言函数与指针 我喜欢的一首歌,不过忘了歌名,歌词好像是“冷冷的夜太凄美,嗜血的堡垒,神的旨意被违背,族人的伤悲。 农村土地如果被占用应如何赔偿? c语言,函数里的指针问题? 歌词“冷冷的夜里北风吹、找不到人安慰、当初的誓言太完美、让相思化成灰、、”是哪首歌里面的? 什么海牙认证? 房子被政府违法强拆如何赔偿 关于c语言的函数指针 是谁在冷冷的夜,我的心事你没发觉.这是哪首歌的歌词? 什么是香港公司海牙公证Apostille c语言指针型函数 现在国家征地赔偿价格是多少钱一亩 c语言中函数指针作为参数与函数的嵌套 冷冷的夜晚北风吹,找不到人安慰 是什么歌? 什么叫做海牙认证?多少钱 中华人民共和国土地征用赔偿法