![如何理解c和c的復(fù)雜類型聲明(免費)._第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/25/cae32586-6e8f-40fd-8da7-24b9e18fd47a/cae32586-6e8f-40fd-8da7-24b9e18fd47a1.gif)
![如何理解c和c的復(fù)雜類型聲明(免費)._第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/25/cae32586-6e8f-40fd-8da7-24b9e18fd47a/cae32586-6e8f-40fd-8da7-24b9e18fd47a2.gif)
![如何理解c和c的復(fù)雜類型聲明(免費)._第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/25/cae32586-6e8f-40fd-8da7-24b9e18fd47a/cae32586-6e8f-40fd-8da7-24b9e18fd47a3.gif)
![如何理解c和c的復(fù)雜類型聲明(免費)._第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/25/cae32586-6e8f-40fd-8da7-24b9e18fd47a/cae32586-6e8f-40fd-8da7-24b9e18fd47a4.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、曾經(jīng)碰到過讓你迷惑不解、類似于int * (* (*fp1 (int 10;這樣的變量聲明嗎? 本文將由易到難,一步一步教會你如何理解這種復(fù)雜的C/C聲明。我們將從天天都能碰到的較簡單的聲明入手,然后逐步加入const修飾符和typedef,還有函數(shù)指針,最后介紹一個能夠讓你準(zhǔn)確地理解任何C/C聲明的 右左法則”需要強調(diào)一下的是,復(fù)雜的C/C聲明并不是好的編程風(fēng)格;我這里僅僅是教你如何 去理解這些聲明。注重:為了保證能夠在同一行上顯示代碼和相關(guān)注釋,本文最好 在至少1024x768分辨率的顯示器上閱讀。讓我們從一個非常簡單的例子開始,如下:int n;這個應(yīng)該被理解為 “declare n a
2、s an int(n是'一個int型的變量)。接下去來看一下指針變量,如下:int *p;這個應(yīng)該被理解為“ declare p as an int *(p是” 個int *型的變量),或者說p是一個指向一個int型變量的指針。我想在這里展開 討論一下:我覺得在聲明一個指針(或引用)類型的變量時,最好將* (或&)寫在緊靠變量之前,而不是緊跟基本類型之后。這樣可以避免一些理解上的誤區(qū),比 如:再來看一個指針的指針的例子:char *argv;理論上,對于指針的級數(shù)沒有限 制,你可以定義一個浮點類型變量的指針的指針的指針的指針,再來看如下的聲明:int RollNum304; i
3、nt (*p4=RollNum; int *q5;這里,p 被聲明為一個指向一個4元素(int類型)數(shù)組的指針,而q被聲明為一個包含5個元素(int類型的指 針)的數(shù)組。另外,我們還可以在同一個聲明中混合實用*和&,如下:int *p1; / p1 is a poin ter to a poin ter to an in t. i nt *&p2; / p2 is a refere nee to a poin ter to an in t. i nt &*p3; / ERROR: P oi nter to a refere nee is illegal. i nt &a
4、mp;&p4; / ERROR: Refere nee to a referenee is illegal.注:p1是一個int類型的指針的指針;p2是一個int類型的指針 的引用;p3是一個int類型引用的指針(不合法?。?p4是一個int類型引用的引 用(不合法?。?。 const修飾符當(dāng)你想阻止一個變量被改變,可能會用到 const要 害字。在你給一個變量加上const修飾符的同時,通常需要對它進行初始化,因為以后的任何時候你將沒有機會再去改變它。例如:const int n=5; int const m=10;上述兩個變量n和m其實是同一種類型的??都是const int (整
5、形恒量)。因為C標(biāo)準(zhǔn) 規(guī)定,const要害字放在類型或變量名之前等價的。我個人更喜歡第一種聲明方 式,因為它更突出了 const修飾符的作用。當(dāng)const與指針一起使用時,輕易讓人 感到迷惑。例如,我們來看一下下面的P和q的聲明:const int *p; intconst *q;他們當(dāng)中哪一個代表const int類型的指針(const直接修飾int),哪 一個代表int類型的const指針(const直接修飾指針)?實際上,p和q都被聲明 為const int類型的指針。而int類型的con st指針應(yīng)該這樣聲明:int * con st r= &n;/ n has been de
6、clared as an ir這里,p和q者E是指向 const int類型的指針,也就是 說,你在以后的程序里不能改變*p的值。而r是一個con st指針,它在聲明的時候 被初始化指向變量n (即r=&n;)之后,r的值將不再答應(yīng)被改變(但*r的值可以 改變)。組合上述兩種con st修飾的情況,我們來聲明一個指向 const int類型的 const 指針,如下: const int * const p=&n / n has bee n declared as const inF 面給出的一些關(guān)于const的聲明,將幫助你徹底理清 const的用法。不過請注重,下面的 一些
7、聲明是不能被編譯通過的,因為他們需要在聲明的同時進行初始化。為了簡潔 起見,我忽略了初始化部分;因為加入初始化代碼的話,下面每個聲明都將增加兩 行代碼。 char * p1; / poin ter to poin ter to char const char *p2; / poin ter to poin ter to const char char * const * p3; / poin ter to const poin ter to char const char * const * p4; / poin ter to const poin ter to const char char
8、 * const p5; / const poin ter to poin ter to char const char * const p6; / const poin ter to poin ter to const char char * const * const p7; / const poin ter to const poin ter to char const char * const * const p8; / const poin ter to const pointer to const char注: p1是指向 char類型的指針的指針; p2是指向 const cha
9、r類型的指針的指針;p3是指向char類型的con st指針;p4是指向con st char類 型的con st指針;p5是指向char類型的指針的const指針;p6是指向con st char類 型的指針的con st指針;p7是指向char類型const指針的con st指針;p8是指向 con st char類型的con st指針的con st指針。typ edef的妙用typ edef給你一種方式來 克服“只適合于變量而不適合于類型”的弊端。你可以如下使用typedef: typedef char * PCHAR; PCHAR p,q;這里的p和q都被聲明為指針。(假如不使用typ
10、edef, q將被聲明為一個char變量,這跟我們的第一眼感覺不太一致?。┫旅嬗?一些使用 typedef的聲明,并且給出了解釋: typedef char * a; / a is a pointer to a char typ edef a b(; / b is a fun cti on that retu rns / a poin ter to a char typ edef b *c; / c is a poin ter to a fun cti on / that retur ns a poin ter to a char typ edef c d(; / d is a fun cti
11、 onreturni ng / a poin ter to a fun cti on / that returns a poin ter to a char typ edef d *e; / e is a pointer to a function / returning a pointer to a / function that returns a / pointer to a char e var10; / var is an array of 10 poin ters to / functions returni ng poin ters to / fun cti ons retur
12、ning poin ters to chars. typ edef經(jīng)常用在一個結(jié)構(gòu)聲明之前,如下。這 樣,當(dāng)創(chuàng)建結(jié)構(gòu)變量的時候,答應(yīng)你不使用要害字struct (在C中,創(chuàng)建結(jié)構(gòu)變量時要求使用struct要害字,如struct tag POINT a;而在C中,struct可以忽略,如 tag POINT b)。typ edef struct tag POINT int x; int y; POINT; P OINT p; /* Valid Ccode */函數(shù)指針 函數(shù)指針可能是最輕易引起理解上的困惑的聲明。函數(shù)指針在DOS時代寫TSR程序時用得最多;在 Win32和X-Windows時代,
13、他們被用在需要 回調(diào)函數(shù)的場合。當(dāng)然,還有其它很多地方需要用到函數(shù)指針:虛函數(shù)表,STL中的一些模板,Win NT/2KXP系統(tǒng)服務(wù)等。讓我們來看一個函數(shù)指針的簡單例子:int (*p(char;這里p被聲明為一個函數(shù)指針,這個函數(shù)帶一個char類型的參數(shù),并且有一個int類型的返回值。另外,帶有兩個float類型參數(shù)、返回值是char類型的 指針的指針的函數(shù)指針可以聲明如下:char * (*p(float, float;那么,帶兩個char類型的con st指針參數(shù)、無返回值的函數(shù)指針又該如何聲明呢?參考如下: void * (*a5(char * const, char * con st
14、;右左法則”是一個簡單的法則,但能讓你準(zhǔn)確理解所有的聲明。這個法則運用如下:從最內(nèi)部的括號開始閱讀聲明,向右看,然后向 左看。當(dāng)你碰到一個括號時就調(diào)轉(zhuǎn)閱讀的方向。括號內(nèi)的所有內(nèi)容都分析完畢就跳出括號的范圍。這樣繼續(xù),直到整個聲明都被分析完畢。對上述 右左法則”做一最內(nèi)部的括號。個小小的修正:當(dāng)你第一次開始閱讀聲明的時候,你必須從變量名開始,而不是從F面結(jié)合例子來演示一下 右左法則”的使用。int * (* (*fp1 (int 10;閱讀步驟:1.從變量名開始?fp1 2.往右看,什么也沒有,碰到了,因此往左 看,碰到一個*?一個指針3.跳出括號,碰到了 (int?一個帶一個int參數(shù)的函數(shù)4
15、. 向左看,發(fā)現(xiàn)一個*?(函數(shù))返回一個指針5.跳出括號,向右看,碰到10?一 個10元素的數(shù)組6.向左看,發(fā)現(xiàn)一個*?指針7.向左看,發(fā)現(xiàn)int?int類型總 結(jié):fp1被聲明成為一個函數(shù)的指針,該函數(shù)返回指向指針數(shù)組的指針.再來看一個 例子:int *( *( *arr5(;閱讀步驟:1.從變量名開始?arr 2.往右看,發(fā)現(xiàn)是一個數(shù)組??一個5元素的數(shù)組3.向左看,發(fā)現(xiàn)一個*?指針4.跳出括號,向右看,發(fā)現(xiàn)(?不帶參數(shù)的函數(shù)5.向左看,碰到*?(函數(shù))返回一個指針6.跳出括號,向右發(fā)現(xiàn)(?不帶參數(shù)的函數(shù)7.向左,發(fā)現(xiàn)*?(函數(shù))返回一個指針8.繼續(xù)向左,發(fā)現(xiàn) int?int 類型還有更多
16、的例子:float ( * ( *b( (; / b is a function that returns a / poin ter to an array of poin ters / to fun cti ons returni ng floats. void * ( *c ( char, int (*(; / c is a poin ter to a fun ctio n that takes / two p arameters: / a char and a poin ter to a / fun cti on that takes no / p arameters and retur
17、ns / an int / and returns a poin ter to void.void * (*d (int & char *(*(char *, char *; / d is a poin ter to a fun ctio n that takes / two p arameters: / a refere nee to an int and a poin ter / to a fun cti on that takes two p arameters: / a poin ter to a char and a poin ter / to a poin ter to a char / and retur ns a po
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度環(huán)保節(jié)能改造工程合同樣本
- 2025年園藝專用花種產(chǎn)銷對接合同范本
- 2025年度互聯(lián)網(wǎng)廣告投放優(yōu)化合同
- 2025年度知識產(chǎn)權(quán)授權(quán)使用及提成合同
- 2025年度國際旅游合作開發(fā)合同范本
- 2025年度婚宴婚紗禮服租賃合同詳細(xì)協(xié)議
- 2025年度旅游風(fēng)景區(qū)廣告牌設(shè)置與維護合同
- 2025年度新能源汽車充電樁招商合作合同
- 2025年度法律服務(wù)居間業(yè)務(wù)合同范本
- 2025年度基礎(chǔ)設(shè)施建設(shè)項目勞務(wù)派遣管理合同
- 2025版大學(xué)食堂冷鏈?zhǔn)巢呐渌头?wù)合同模板3篇
- 新能源發(fā)電項目合作開發(fā)協(xié)議
- 《中醫(yī)體重管理臨床指南》
- 2025年上半年潞安化工集團限公司高校畢業(yè)生招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 2024年鐵嶺衛(wèi)生職業(yè)學(xué)院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 2025年山東魯商集團有限公司招聘筆試參考題庫含答案解析
- 大型活動中的風(fēng)險管理與安全保障
- 課題申報書:個體衰老差異視角下社區(qū)交往空間特征識別與優(yōu)化
- 江蘇省招標(biāo)中心有限公司招聘筆試沖刺題2025
- 綜采工作面過空巷安全技術(shù)措施
- 云南省麗江市2025屆高三上學(xué)期復(fù)習(xí)統(tǒng)一檢測試題 物理 含解析
評論
0/150
提交評論