下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGEPAGE5如何理解和應(yīng)用C語言中的復(fù)雜聲明曹定成(華中科技大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北武漢430074)摘要:討論了正確理解復(fù)雜聲明的含義以及正確使用復(fù)雜聲明所說明的對象的方法。討論了各種基本類型指針,構(gòu)成復(fù)雜聲明的基本元素,以及類型說明符和數(shù)據(jù)類型名的優(yōu)先級和結(jié)合性。并以復(fù)雜聲明char*(*(*f(char*(*para)(char*)))[2])();為例討論了解釋復(fù)雜聲明的步驟和方法,給出了解釋結(jié)果,并且給出了使用復(fù)雜聲明的應(yīng)用實(shí)例。關(guān)鍵詞: 復(fù)雜聲明;C語言;指針中圖法分類號:TP312文獻(xiàn)表示碼:AHowtoUnderstandingandUsingtheComplicatedDeclarationsinCDingchengCao(CollegeofComputerSci.&Tech.HuazhongUniversityofScienceandTechnology, Wuhan430074,China)Abstract:Inthispaper,amethodofcorrectlyunderstandingthemeaningofacomplicateddeclarationandusingtheobjectinacomplicateddeclarationarediscussed.Variousprimarypointers,thebasicelementsincomplicateddeclaration,andtheprecedenceandtheleft-associativityoftheoperatorsandthetypespecifiersarealsodiscussed.Accordingtothecomplicateddeclarationchar*(*(*f(char*(*para)(char*)))[2])();theapproachandthemethodofinterpretingcomplicateddeclarationareintroduced.Meanwhile,theapplicationexampleofusingcomplicateddeclarationisputforward.Keywords:complicateddeclarations;C;pointer1引言指針是C語言中的一個(gè)重要概念,也是C語言的一個(gè)重要特色[1]。以指針為基礎(chǔ)的復(fù)雜聲明是C語言中的重要組成部分。對于形如char*(*(*f(char*(*para)(char*)))[2])();的復(fù)雜聲明語句,許多C語言的學(xué)習(xí)者都感到f的含義非常難以理解,更不敢問津f的使用。的確,復(fù)雜聲明是學(xué)習(xí)C語言的難點(diǎn)。但是,準(zhǔn)確理解復(fù)雜聲明的含義也是提高C程序員素質(zhì)的重要途徑。B.W.Kernighan和D.M.Ritchie曾經(jīng)說過:“毫無疑問,復(fù)雜聲明的確產(chǎn)生于實(shí)踐,但知道如何去理解它們以及在必要時(shí)知道如何去創(chuàng)建它們卻是非常重要的[2]?!笨梢赃@樣說:對復(fù)雜聲明的精確理解,以及創(chuàng)建、使用和駕馭復(fù)雜聲明的熟練程度是衡量一個(gè)C程序員C語言素質(zhì)高低的重要指標(biāo)之一。如何才能正確理解復(fù)雜聲明的含義?如何在理解復(fù)雜聲明含義的基礎(chǔ)上正確使用復(fù)雜聲明所說明的對象?其方法是:首先,要對基本類型指針的理解打下扎實(shí)的基礎(chǔ);其次,在復(fù)雜聲明的解釋過程中要嚴(yán)格按照優(yōu)先級和結(jié)合性來進(jìn)行;然后才是在理解的基礎(chǔ)上使用復(fù)雜聲明。2基本類型指針在C語言中,稱存儲某個(gè)變量a的地址值的變量p為指針變量。當(dāng)指針變量p存儲變量a的地址時(shí),稱p指向a。在不產(chǎn)生二義情況下,往往稱指針變量為指針。指針類型是派生類型。根據(jù)指針?biāo)缸兞渴亲址?、整型、或浮點(diǎn)型變量,將指針稱為字符指針、整型指針、或浮點(diǎn)指針。如:intx=1,*pi=&x;就說明了pi是指向整型變量x的整型指針。數(shù)組也可以用指針表示。如:inta[5],*pa=a;它使指針pa指向一維數(shù)組元素a[0],pa是指向數(shù)組元素的指針。如果用指針表示多維數(shù)組,則需要用到指向數(shù)組的指針。如:intb[2][3],(*pb)[3]=b;此時(shí)pb是指向有三個(gè)元素的一維數(shù)組的指針,它指向b數(shù)組中行下標(biāo)為0的行。那么,pa++和pb++有什么區(qū)別呢?pa++使pa指向a[1],pa的值增加sizeof(int);而pb++使pb指向b數(shù)組中行下標(biāo)為1的行,pb的值增加3*sizeof(int)。由同類型指針可以構(gòu)成指針數(shù)組。如:int*p[3];說明p是有三個(gè)元素的整型指針數(shù)組。即:指針數(shù)組p中的每個(gè)元素都是一個(gè)整型指針。因此,如果有聲明語句:intx=2,y=2,z=3;則:p[0]=&x;p[1]=&y;p[2]=&z;就使指針數(shù)組p中的元素分別指向整型變量x、y、z。如果一個(gè)指針以某個(gè)函數(shù)的入口地址為其值,則該指針稱為指向函數(shù)的指針,簡稱為函數(shù)指針。如:int(*pf)(char*,int*);說明pf是一個(gè)函數(shù)指針,它所指向的函數(shù)有一個(gè)字符指針和一個(gè)整型指針為形參,且返回值為整型值。如果有聲明語句:intfun(char*a,int*b);并且fun有定義,則pf=fun就使函數(shù)指針pf指向了函數(shù)fun。設(shè)pc,pi是已賦值的字符指針和整型指針,則通過(*pf)(pc,pi)或pf(pc,pi)就可以調(diào)用函數(shù)fun。如果函數(shù)的返回值是指針類型的值,該函數(shù)就稱為指針函數(shù)[3]。所以,指針函數(shù)是返回值為指針值的函數(shù)。如:int*fp(inta);就說明fp是一個(gè)整型指針函數(shù),它返回一個(gè)整型指針值。通過指針函數(shù),可以使函數(shù)間接返回可以被調(diào)用函數(shù)處理的多個(gè)值。字符指針、整型指針、浮點(diǎn)指針、指向數(shù)組元素的指針、指向數(shù)組的指針、指針數(shù)組、函數(shù)指針和指針函數(shù)都被稱為基本類型的指針。3理解復(fù)雜類型的關(guān)鍵構(gòu)成復(fù)雜聲明的基本元素是類型說明符和數(shù)據(jù)類型名。理解復(fù)雜類型的關(guān)鍵是理解并正確運(yùn)用類型說明符和數(shù)據(jù)類型名在解釋過程中的優(yōu)先級和結(jié)合性。復(fù)雜聲明中的類型說明符有:()、[]、*三種。其中()用于說明函數(shù)類型以及改變說明的先后順序;[]用于說明數(shù)組類型;*則用于說明指針類型。數(shù)據(jù)類型名可以是int、char、float、double、void等基本類型名,也可以是用戶自定義的構(gòu)造類型。在解釋復(fù)雜聲明時(shí),要按照()、[]優(yōu)先級最高,*次之,而數(shù)據(jù)類型名的優(yōu)先級最低的順序來解釋。當(dāng)()和[]同時(shí)在復(fù)雜聲明中出現(xiàn)時(shí),就需要考慮類型說明符的結(jié)合性。C語言規(guī)定,類型說明符()和[]的結(jié)合性是左結(jié)合,即按從左至右的順序進(jìn)行解釋。在具體的解釋過程中,對復(fù)雜聲明要按照優(yōu)先級和結(jié)合性進(jìn)行解釋順序的分解,確定解釋的先后順序,然后進(jìn)行逐步分析,在每一步分析過程中要運(yùn)用基本類型指針涉及的知識進(jìn)行解釋,最后歸納綜合出復(fù)雜聲明的含義。以復(fù)雜聲明char*(*(*f(char*(*para)(char*)))[2])();為例。首先按照類型說明符和數(shù)據(jù)類型名的優(yōu)先級和結(jié)合性對其進(jìn)行分解得到:f(char*(*)(char*para))*[2]*()*char①②③④⑤⑥⑦①f與(char*(*para)(char*))作用后可以得出:f是一個(gè)函數(shù)。char*(*para)(char*)是f函數(shù)的形參說明。它的解釋順序是:para*(char*)*char。即f函數(shù)的形參para是一個(gè)函數(shù)指針,所指向的函數(shù)有一個(gè)字符指針的形參,并且返回值是字符指針值。②與*作用后得出:f是一個(gè)指針函數(shù)。即f函數(shù)的返回值是一個(gè)指針值。③與[3]作用后得出:f是一個(gè)指針函數(shù),其返回值是指向有兩個(gè)元素?cái)?shù)組的指針。④與*作用后得出:f是一個(gè)指針函數(shù),其返回值是指向有兩個(gè)元素的指針數(shù)組的指針。⑤與()作用后得出:f是一個(gè)指針函數(shù),其返回值是指向有兩個(gè)元素的函數(shù)指針數(shù)組的指針,函數(shù)指針數(shù)組中的指針元素所指函數(shù)無參。⑥與*作用后得出:f是一個(gè)指針函數(shù),其返回值是指向有兩個(gè)元素的函數(shù)指針數(shù)組的指針,函數(shù)指針數(shù)組中的指針元素所指函數(shù)無參,其返回值為指針值。⑦與char作用后得出:f是一個(gè)指針函數(shù),其返回值是指向有兩個(gè)元素的函數(shù)指針數(shù)組的指針,函數(shù)指針數(shù)組中的指針元素所指函數(shù)無參,其返回值為字符指針值。所以,上面的復(fù)雜說明說明f是一個(gè)指針函數(shù);其形參para是一個(gè)函數(shù)指針,para所指向的函數(shù)有一個(gè)字符指針的形參,返回值是字符指針值;并且,f函數(shù)的返回值是指向有兩個(gè)元素的函數(shù)指針數(shù)組的指針,函數(shù)指針數(shù)組中的指針元素所指函數(shù)無參,其返回值為字符指針值。其物理含義可以由圖1表示。[0][0][0][1]…[2][1]char*f00();char*f00();char*f01();f(char*(*para)(char*));char*f01();……char*f21();char*f21();圖1復(fù)雜聲明char*(*(*f(char*(*para)(char*)))[2])();物理含義的圖示4復(fù)雜類型的應(yīng)用要掌握復(fù)雜聲明,就需要在理解復(fù)雜聲明的基礎(chǔ)上進(jìn)一步使用復(fù)雜聲明。它可以進(jìn)一步反過來強(qiáng)化對復(fù)雜聲明的理解。仍以char*(*(*f(char*(*para)(char*)))[2])();為例,討論如何使用f。首先要構(gòu)造f函數(shù)的形參,其次要構(gòu)造f函數(shù)的返回值。f函數(shù)的形參是一個(gè)指向有字符指針形參的字符指針函數(shù)的函數(shù)指針。因此在main函數(shù)中通過char*(*pf)(char*);聲明了pf為函數(shù)指針;同時(shí),通過聲明char*fun(char*s);和pf=fun;使函數(shù)指針pf指向函數(shù)fun。這樣,通過f(pf)就可以調(diào)用f函數(shù)。由于f函數(shù)的返回值是指向有兩個(gè)元素的函數(shù)指針數(shù)組的指針,因此需要聲明一個(gè)二維函數(shù)指針數(shù)組a,在f函數(shù)中通過char*(*(*pa)[2])();聲明pa是指向有兩個(gè)元素的函數(shù)指針數(shù)組的指針,通過pa=a就使pa指向了二維函數(shù)指針數(shù)組a。同時(shí),在f函數(shù)中通過pa向二維函數(shù)指針數(shù)組a的各個(gè)元素進(jìn)行賦值。從a[0][0]開始,到a[2][1]為止,各個(gè)元素依次指向函數(shù)f00到f21。通過returnpa;將指向二維函數(shù)指針數(shù)組a的指針值返回。與此同時(shí),在main函數(shù)中通過p=f(pf);使p指向二維函數(shù)指針數(shù)組a。在雙重循環(huán)中通過(*p[i][j])()依次調(diào)用函數(shù)f00、f01、…、f20、f21。也可以用p[i][j]()的形式來進(jìn)行調(diào)用。相應(yīng)的程序如下:#include"stdio.h"char*fun(char*s);/*fun是有字符指針形參的字符指針函數(shù)*/char*(*(*f(char*(*para)(char*)))[2])();char*f00();char*f01();/*f00到f21都是無參字符指針函數(shù)*/char*f10();char*f11();char*f20();char*f21();char*(*a[3][2])();/*聲明二維函數(shù)指針數(shù)組a*/voidmain(void){ char*(*(*p)[2])();/*p是指向有兩個(gè)元素的函數(shù)指針數(shù)組的指針*/ char*(*pf)(char*);/*pf是指向有字符指針形參的字符指針函數(shù)的函數(shù)指針*/ inti,j; pf=fun;/*對pf賦值,使pf指向函數(shù)fun*/ p=f(pf);/*調(diào)用f函數(shù),返回指向二維函數(shù)指針數(shù)組指針值賦給指針p*/ for(i=0;i<3;i++) for(j=0;j<2;j++) printf("%s\n",(*p[i][j])());/*通過指針p調(diào)用f00、…、f21*/}char*f00()/*定義函數(shù)f00*/{ staticchars00[]="functionf00iscalled!"; returns00;}char*f01()/*定義函數(shù)f01*/{ staticchars01[]="functionf01iscalled!"; returns01;}char*f10()/*定義函數(shù)f10*/{ staticchars10[]="functionf10iscalled!"; returns10;}char*f11()/*定義函數(shù)f11*/{ staticchars11[]="functionf11iscalled!"; returns11;}char*f20()/*定義函數(shù)f20*/{ staticchars20[]="functionf20iscalled!"; returns20;}char*f21()/*定義函數(shù)f21*/{ staticchars21[]="functionf21iscalled!"; returns21;}char*(*(*f(char*(*para)(char*)))[2])()/*定義函數(shù)f*/{ char*(*(*pa)[2])();/*聲明指向有兩個(gè)元素的函數(shù)指針數(shù)組的指針pa*/ char*pret; pa=a;/*使pa指向二維函數(shù)指針數(shù)組a*/ pret=(*para)("thisisatest!");/*調(diào)用para所指函數(shù),返回值賦給pret*/ printf("infunctionf,pretis%s\n",pret);/*輸出pret所指對象*/ pa[0][0]=f00;pa[0][1]=f01;/*對二維函數(shù)指針數(shù)組的元素進(jìn)行賦值*/ pa[1][0]=f10;pa[1][1]=f11; pa[2][0]=f20;pa[2][1]=f21; returnpa;/*返回指向二維函數(shù)指針數(shù)組的指針*/}char*fun(char*s)/*定義有字符指
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024抵押借貸合同范文
- 2024咨詢服務(wù)合同范本標(biāo)準(zhǔn)范文
- 廣東省珠海市七年級上學(xué)期語文期中試卷7套【附答案】
- 2024藥品代理合同范本
- 單位團(tuán)購房產(chǎn)轉(zhuǎn)讓合同范本
- 企業(yè)財(cái)產(chǎn)出售協(xié)議樣式
- 2024年農(nóng)村房屋轉(zhuǎn)讓協(xié)議范本
- 七年級地理上冊5.1《世界的人口》教案粵教版
- 2024版標(biāo)準(zhǔn)家庭裝修協(xié)議
- 建筑外墻保溫工程施工合同
- 《狙擊手》和《新神榜楊戩》電影賞析
- 槍庫應(yīng)急處置預(yù)案
- 老年患者術(shù)后譫妄的護(hù)理干預(yù)
- 《凸透鏡成像的規(guī)律》課件
- 倉庫管理中的客戶服務(wù)和溝通技巧
- 規(guī)劃選址及用地預(yù)審
- 土砂石料廠項(xiàng)目融資計(jì)劃書
- 2024年給藥錯(cuò)誤護(hù)理不良事件分析持續(xù)改進(jìn)
- 郵政營銷策劃方案
- 國際貿(mào)易法與跨境業(yè)務(wù)合規(guī)的風(fēng)險(xiǎn)管理與應(yīng)對策略
- 麻醉科臨床診療指南2020版
評論
0/150
提交評論