c结构体与函数指针的特殊应用

c结构体与函数指针的特殊应用

ID:10899849

大小:31.00 KB

页数:3页

时间:2018-07-08

c结构体与函数指针的特殊应用_第1页
c结构体与函数指针的特殊应用_第2页
c结构体与函数指针的特殊应用_第3页
资源描述:

《c结构体与函数指针的特殊应用》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C结构体与函数指针的特殊应用    在C++中,我们很容易就可以实现函数重载,特别是类的同名方法(多态)。那么,在C语言中我们可以有类似的应用吗?    下面先给出我的说明代码,再做解释://-----------------------------------------------------------//#includestructA{//thisisdataintdata;//thisisoperationvoid*(*function)();};voidmyfun1(){pr

2、intf("thisisfun()");return;}intmyfun2(inta){printf("thisisfun(%d)",a);returna;}charmyfun3(inta){printf("thisisfun(%c)",a);returna;}intmain(void){structAa;a.function=(void*)myfun2;a.function('a');a.function=(void*)myfun3;a.function('a');return0;}//--

3、---------------------------------------------------------//在GCC下编译运行的结果如下://-----------------------------------------------------------//[zonwang@be-rdcnasbd1test]cc-c-gfun_point.c[zonwang@be-rdcnasbd1test]cc-ofun_pointfun_point.o[zonwang@be-rdcnasbd1test

4、]./fun_pointthisisfun(97)thisisfun(a)//-----------------------------------------------------------//现在分析一下上面的代码:首先,这个程序的思路是想用一个结构体模拟一个类,通过函数指针来申明“类”方法,并模拟多态性。      void*(*fun)();--------(1)是一个函数指针,注意,这里不要写成      void(*fun)();--------(2)接下来写了两个函数   voidmyf

5、un1();   intmyfun2(int);在接下来的main函数中,我们为A实例a的fun域赋值,这里我们直接赋值了myfun2,若上面方法申明中采用(2),那么将不能把myfun2赋值给fun,因为void*是可以指向任何类型的指针,那么当然可以指向int。这里又定义了myfun3就是为类看看void*是否能自动的转化为char类型了。   另外要说明的一点就是,调用a.fun时我实验了几种调用方法,如程序中所示,它对行参没有任何要求,在本例中,由于传入的是myfun2(int),若不加任何参数调

6、用a.fun(),那么输入的int将随机而定;若参数多于两个,则只有第一个参数有效,其余参数被呼略掉;若第一个参数与所传入的函数不匹配,则虽然可以通过编译,但结果一般会与期望的不同(错误)。   那么,它是否是多态呢?显然不是的,多态是个运行时概念,若想在C里面用同名函数则必须如此利用函数指针,在使用不同的重载形式前必须给函数指针赋上相应的函数才行,在本例中,若要用重载型myfun3的话,在调用a.fun(...)前必须有这样一行   a.fun=myfun3;这是因为C毕竟还是一个静态语言的原因。   

7、这种结构体与函数指针的结合使用还有很多用途,其实也可以将公用体与函数指针结合,方法一样。这几种结合功能相当强大。在定义接口时将非常有用。   比如在写一个设备驱动程序时,我们就要填写一个数据结构file_operations,具体的定义如下:structfile_operations{int(*seek)(structinode*,structfile*,off_t,int);int(*read)(structinode*,structfile*,char,int);int(*write)(structi

8、node*,structfile*,off_t,int);int(*readdir)(structinode*,structfile*,structdirent*,int);int(*select)(structinode*,structfile*,int,select_table*);int(*ioctl)(structinode*,structfile*,unsinedint,unsignedlongint(*mmap)(

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。