指针进阶第五站:函数指针!.docx

上传人:lao****ou 文档编号:800811 上传时间:2024-05-27 格式:DOCX 页数:11 大小:116.18KB
下载 相关 举报
指针进阶第五站:函数指针!.docx_第1页
第1页 / 共11页
指针进阶第五站:函数指针!.docx_第2页
第2页 / 共11页
指针进阶第五站:函数指针!.docx_第3页
第3页 / 共11页
指针进阶第五站:函数指针!.docx_第4页
第4页 / 共11页
指针进阶第五站:函数指针!.docx_第5页
第5页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《指针进阶第五站:函数指针!.docx》由会员分享,可在线阅读,更多相关《指针进阶第五站:函数指针!.docx(11页珍藏版)》请在第一文库网上搜索。

1、指针进阶第五站:函数指针!函数指针函数也有自己的地址,函数名/&函数名就是函数的地址3intAdd(intx,inty)I(returnx+y;3voidtest(char*str)3intmain0printf(%pn,&Add);.+xn0x7B13B6Printf(%Pn,Add);邮福邮1.1基本形式在数组指针的学习中我们了解到intarr5;int(*pa)5=&arr;Pa是数组指针指针变量Pa的类型是int(*)5那么函数指针的形式是怎样的呢?void(*pt)(char*)=test;voidtest(char*str)intmain()Pt是一个函数指针return0;pt的

2、类型是void(*)(char*)下面哪个代码有能力存放函数的地址呢?void(*pfun1)();void*pfun2();答:PfUnI可以存放pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为VOidPfUn2先和()结合,判断为一个返回值为int*类型的函数那么,如何书写一个函数指针呢?intAdd(intx,inty)returnx+y;以A值函数为例,它有两个int类型的形参,返回类型是int所对应的函数指针就是int(*)(int,int)类型int(*pf)(int,int)=Add;依据以下几步就能正确写出函数指针(1)确定函数的

3、返回类型(2)确定函数的参数类型和个数(3)把函数参数类型里的变量名去掉,放入括号里(intX,inty)去掉x、y,即(int,int)(4)在前面加上函数的返回类型(5)最后加上(*),以及函数指针变量名需要注意的是,(*pf)的括号不能省略,否则编译器会报错去掉括号之后就相当于函数声明,无法赋值212I213I214I21514%()1:intarr5;1int(*pa)5=&arr/pa是数组指;void*pt(char*)=test;IIIAO打吴列表整个解决方案(g)m21AI消息0国生成”代码说明起E0145未能初始化函数pt()pt:函数的初始化C语言编程12用函数指针来调用函

4、数如下图所示,当我们定义了一个函数指针后就可以通过指针来访问原函数这时候(*pf)其实就相当于my_testintmyetest(char*s)int(*pf)(int,int)=Add;intsum=(*pf)(2,3);intsum1=pf(2,3);.MicrosoftVisua1StucFintsum2二Add(2,3);5Prirrtf(%dn,sum);5PriITEf(WjT,SUmi);p;printf(,%dn,sum2);症缶f懑期碉因为我们己经把Add的地址转给了pf指针,函数名Add和指针Pf实际上是等价的所以在使用函数指针的时候,可以不带*使用。但是带*的时候一定要加

5、括号!1. 3两个奇葩的代码奇葩代码1(*(void(*)()0)();这里的0仅为示例,我们在正常使用的时候并不能访问0的地址看到这个代码的时候,是不是有点懵?别急,让我们来慢慢分析一波!将代码适当地用空格分开再去调用O地址处一个函数指针这个参数为无一void()|0();返回类型为Void/1干1解引用?错误!的函数对该函数指针,把0强制学指针void(*)()因为函数指针类型为VOid,所以对应的函数返回值是void奇葩代码2void(*signa1(int,void(*)(int)(int);首先,将代码分离void(*signa1int,void(*)(int)(in1Signa1先

6、与()结合,是一个函数2.该函数的参数是和Void(*)(int)3.该函数的返类型是VOid(*)(int)七C瘠说人话就是,Signa1函数内传入了一个Void(*)(int)的函数指针,返回值也是一个Void(*)(int)的函数指针!voidfun(intnum)printf(,fun一%d,num);void(*signa1(int,void(*)(int)(int);intmain()Void(*pf)(int);定义一个函数指针pf=signa1(100,fun);为SignaI函数传参,并用Pf指针接收return0;“这个代码2是真的奇葩,就没有什么办法把他变成人话吗?(简化

7、一下)”当然有!那就是用typedef函数来给VOid(*)(int)指针起一个新名字!typedefvoid(*pf_t)(int);把VOid(*)(int)命名为pf_tvoid(*p)(int);/p是函数指针变量的名字typedefvoid(*pf_t)(int);/pf_t层一个新的卷刑Xz这样我们的代码就能得到简化void(*signa1(int,void(*)(int)(int);源代码简化后pf_tsigana1(int,pf_t);这样是不是就更容易分辨了?2函数指针数组2.1基本形式既然函数指针也是一个指针类型,那我们就可以用指针数组来存放它前提:这些函数的参数类型、返回

8、类型一致intAdd(intx,inty)returnx+y;intSub(intx,inty)returnx-y;intMu1(intx,inty)returnx*y;intDiv(intx,inty)returnx/y;函数指针数组int(*pfArr4)(int,int)=Add,Sub,Mu1,Div;相比于分开写多次函数调用/多次函数调用int(*pf1)(int,int)=Add;int(*pf2)(int,int)=Sub;int(*pf3)(int,int)=Mu1;int(*pf4)(int,int)=Div;函数指针数组可以让我们以使用数组的形式来访问每个函数intAdd(

9、intx,inty)returnx+y;intSub(intx,inty)returnx-y;intMu1(intx,inty)returnx*y;intDiv(intx,inty)returnx/y;intmain()int(*pfArr4)(int,int)=Add,Sub,Mu1,Div;函数指针数组inti=O;for(i=0;i);scanf(zz%dzz,&input);case 1: Printf(输入2个操作数:);y);ret=Add(x,y);printfCret=%dcase 2: Printf(输入2个操作数:;y);ret=Sub(x,y);printf(z,ret=

10、%dcase 3: Printf(输入2个操作数:);ty);ret=Mu1(x,y);printf(z,ret=%dcase 4: Printf(输入2个操作数:);ty);ret=Div(x,y);printf(z,ret=%d”,ret);break;caseO:Printf(退出计算器);break;defau1t:Printf(选择错误);break;whi1e(input);returnO;这种方式需要写非常多的重复代码,而且代码长度很长??我们可以使用函数指针对它进行优化2. 2.2函数指针形式intmain()intinput=O;intx=O;inty=O;intret=O;

11、int(*pfArr5)(int,int)=0,Add,Sub,Mu1,Div;PfArr是一个函数指针的数组,也叫转移表domenu();Printf(请选择:);SCanf&input);if(input=0)Printf(退出计算器);break;e1seif(input=1&input);scanf(z,%d%d,&x,&y);ret=pfArrinput(x,y);printf(z,ret=%d,ret);e1sePrintf(选择错误);whi1e(input);return0;这样就避免了我们在每个case语句里都写上输入提示、scanf和不同的函数调用所导致的代码冗余了运行试试

12、吧!KxKMK1.add2.sub.KKXKXdCJC3.mu14.divX聚,蕤IC0.exitHHHH请选择:1输入2个操作数二3ret=7wYXYYI.add:1mu1Ikexit2subMMXKM.aQ1UJCdCMEMMMmmmkjckmxxkmx请选择二“,C语言竭程学习基地输入2个操作数二55ret=12.3指向函数指针数组的指针函数指针数组是一个数组,数组可以用数组指针来存放地址指向函数指针数组的指针:是一个指针该指针指向一个数组,数组的每个元素都是一个函数指针intAdd(intx,inty)returnx+y;intmain()int(*pa)(int,int)=Add;函数指针int(*pfA4)(int,int);函数指针的数组int(*(*ppfA)4)(int,int)=&pfA;/ppfA是一个指针,该指针指向了一个存放函数指针的数组return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服