C语言指针函数和函数指针1

C语言指针函数和函数指针1

ID:41393867

大小:54.95 KB

页数:9页

时间:2019-08-24

上传者:U-991
C语言指针函数和函数指针1_第1页
C语言指针函数和函数指针1_第2页
C语言指针函数和函数指针1_第3页
C语言指针函数和函数指针1_第4页
C语言指针函数和函数指针1_第5页
资源描述:

《C语言指针函数和函数指针1》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

C语言指针函数和函数指针1Istheaddressofanelementofanarray.Theoutputisthevalueinthisaddress・Two,functionpointerThepointertothefunctioncontainstheaddressofthefunction,andyoucancallthefunctionthroughit.Thedeclarationformatisasfollows:Thetypespecifier(*functionname)(parameters)Infact,thiscannotbecalledafunctionname・Itshouldbecalledthevariablenameofthepointer・Thisspecialpointerpointstoafunctionthatreturnstheintegervalue・Thedeclarationandcuttingitpointstothefunctiondeclarationconsistent.Theparenthesesoutsidethepointerandpointeroperatorschangethedefaultoperatorprecedence・Ifthereisnoparentheses,itbecomesaprototypedeclarationofthefunctionthatreturnstheintegerpointer.Suchas:Void(*fptr)();Assigningtheaddressofafunctiontoafunctionpointercantakethefollowingtwoforms:Fptr=&Function; Fptr二Function;Theaddressoperatorisnotrequiredbecauseonlyafunctionidentifierrepresentsitsaddress,andifitisafunctioncall,itmustincludeaparametertableenclosedinparentheses・Thefollowingtwowayscanbeusedtocallfunctionsthroughpointers:X二(*fptr)();X=fptr();Thesecondformatslooklikefunctioncalls・However,someprogrammersprefertousethefirstformatbecauseitexplicitlystatesthatthefunctioniscalledthroughpointersratherthanfunctionnames・Here'sanexample:Void(*funcp)();Void,FileFunc(),EditFunc();(main)Funcp二FileFunc;(*funcp)();Funcp=EditFunc; (*funcp)();Void,FileFunc()Printf(〃F订eFunc 〃);Void,EditFunc()Printf(zzEditFunc zz);Programoutputas:FileFuncEditFuncThree,pointerThepointerofthepointerseemspuzzling.Theirdeclarationshavetwostars・Suchas: Char**cp;Ifyouhavethreestars,that'sthepointertothepointer・Thefourasteriskisthepointertothepointerofthepointer,andsoon.Whenyouarefamiliarwithsimpleexamples,youcandealwithcomplexsituations・Ofcourse,inpractice,youuseonlytwopointers,andthreestarsareuncommon,letalonefourstars・Thepointerofapointerrequirestheaddressofthepointer.Charc二'A';Char*p=&c;Char**cp二&p;Apointertoapointercannotonlyaccessthepointeritispointingto,butalsoaccessthedataitrefersto.Hereareafewexamples:Char*pl二*cp;Charcl=**cp;Youmightwanttoknowwhatthestructureisfor・Usingthepointerofapointerallowsthecallingfunctiontomodifythelocalpointervariablesandthearrayofprocessingpointers. VoidFindCredit(int**);(main){Int,vals[]={7,6,5,-4,3,2,1,0}:Int*fp=vals;FindCredit(&fp);Printf(〃%d 〃,*fp);}VoidFindCredit(int**FPP){Wh订e(**fpp,=0)If(**fpp〈0)break;Else(*fpp)++;First,thepointerFPisinitializedwiththeaddressofanarray,dndthentheaddressofthepointerispassedtothefunction FindCredit()asanargument・TheFindCredit()functionindirectlyobtainsthedatainthearraybyexpression**fpp・Totraverseanarraytofindanegativevalue,theFindCredit()functionaddsitselftotheobjectbythecaller,spointertothearray,notitsownpointertothecaller,spointer・Statement(*fpp)++istoapointertothepointerparameterincrementoperation・Butbecausethe*operatorishigherthanthe++operator,sotheparenthesesmustbeherewithouttheparentheses,thenthe++operatorwillbeappliedtothedoublepointerfpp・FourpointertopointerarrayPointerpointer,anotheruse,oldprocessingpointerarray.Someprogrammersliketousepointerarraysinsteadofmultidimensionalarrays・Onecommonuseistoprocessstrings・Char*Names[]={〃Bill・〃〃,Sam.,〃Jini・〃〃‘〃Paul.〃〃,"Charles'.〃〃,Zero};(main) {Char**nni二Names;Wh订e(*nm,=0)printf(%s ,*nm++);}ThepointerNamesisinitializedwiththeaddressofthecharacterpointerarraynni.Eachprintf()callpassesthecharacterpointertothepointernmfirst,andthenaddsthenmtothenextelement(orpointer)ofthearray.Notethatthesyntaxfortheaboveviewis*nm++,whichfirsttakesthepointertothecontent,andthenmakesthepointerself-increasing・Noticethatthelastelementinthearrayisinitializedto0,PointerfunctionWhenafunctiondeclaresthatitsreturnvalueisapointer,itactuallyreturnsanaddresstothecallingfunctionforanexpressionthatrequiresapointeroraddress・Format:Thetypespecifier*functionname(parameter)Ofcourse,sincethereturnisanaddress,sothetypespecifierisgenerallyint・Forexample:int^GetDate(); Int*AAA(int,int);Thefunctionreturnsanaddressvaluethatisoftenusedtoreturntheaddressofanelementofanarray.Int*GetDate(int,wk,int,Dy);(main){intwk,mud:do{printf("enterweek(1-5)day(1-7) ');scanf('%d%d',&wk,&dy);wh订e(wk1||wk>5||dy<1|dy>7);printf('%d ',*getdate(wk,dy));}int*getdate(intwk,intdy){ staticintcalendar[5],[7.二{1,2,3,4,5,6,7{},&9,10,11,12,13,14{},15,16,17,1&19,20,21{},22,23,24,25,26,27,28{},29,30,31{-1},};return&calendar(wk1][dy1];程序应该是很好理解的,子函数返回while循环以次来判断是否到了数组末尾•具有零值的指针常常被用做循环数组的终止符•程序员称零值指针为空指针(null).采用空指针作为终止符,在树种增删元素时,就不必改动遍历数组的代码,因为此时数组仍然以空指针作为结束.

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

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

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