• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            [HORSETAIL]

            花兒,總會有謝的時候

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              11 隨筆 :: 21 文章 :: 7 評論 :: 0 Trackbacks

            作者:未知???

            ???????C語言所有復(fù)雜的指針聲明,都是由各種聲明嵌套構(gòu)成的。如何解讀復(fù)雜指針聲明呢?右左法則是一個既著名又常用的方法。不過,右左法則其實(shí)并不是C標(biāo)準(zhǔn)里面的內(nèi)容,它是從C標(biāo)準(zhǔn)的聲明規(guī)定中歸納出來的方法。C標(biāo)準(zhǔn)的聲明規(guī)則,是用來解決如何創(chuàng)建聲明的,而右左法則是用來解決如何辯識一個聲明的,兩者可以說是相反的。右左法則的英文原文是這樣說的:

            The?right-left?rule:?Start?reading?the?declaration?from?the?innermost?parentheses,?go?right,?and?then?go?left.?When?you?encounter?parentheses,?the?direction?should?be?reversed.?Once?everything?in?the?parentheses?has?been?parsed,?jump?out?of?it.?Continue?till?the?whole?declaration?has?been?parsed.?


            這段英文的翻譯如下:

            右左法則:首先從最里面的圓括號看起,然后往右看,再往左看。每當(dāng)遇到圓括號時,就應(yīng)該掉轉(zhuǎn)閱讀方向。一旦解析完圓括號里面所有的東西,就跳出圓括號。重復(fù)這個過程直到整個聲明解析完畢。

            ????????筆者要對這個法則進(jìn)行一個小小的修正,應(yīng)該是從未定義的標(biāo)識符開始閱讀,而不是從括號讀起,之所以是未定義的標(biāo)識符,是因?yàn)橐粋€聲明里面可能有多個標(biāo)識符,但未定義的標(biāo)識符只會有一個。

            ????????現(xiàn)在通過一些例子來討論右左法則的應(yīng)用,先從最簡單的開始,逐步加深:

            int?(*func)(int?*p);

            首先找到那個未定義的標(biāo)識符,就是func,它的外面有一對圓括號,而且左邊是一個*號,這說明func是一個指針,然后跳出這個圓括號,先看右邊,也是一個圓括號,這說明(*func)是一個函數(shù),而func是一個指向這類函數(shù)的指針,就是一個函數(shù)指針,這類函數(shù)具有int*類型的形參,返回值類型是int。

            int?(*func)(int?*p,?int?(*f)(int*));

            func被一對括號包含,且左邊有一個*號,說明func是一個指針,跳出括號,右邊也有個括號,那么func是一個指向函數(shù)的指針,這類函數(shù)具有int?*和int?(*)(int*)這樣的形參,返回值為int類型。再來看一看func的形參int?(*f)(int*),類似前面的解釋,f也是一個函數(shù)指針,指向的函數(shù)具有int*類型的形參,返回值為int。

            int?(*func[5])(int?*p);

            func右邊是一個[]運(yùn)算符,說明func是一個具有5個元素的數(shù)組,func的左邊有一個*,說明func的元素是指針,要注意這里的*不是修飾func的,而是修飾func[5]的,原因是[]運(yùn)算符優(yōu)先級比*高,func先跟[]結(jié)合,因此*修飾的是func[5]。跳出這個括號,看右邊,也是一對圓括號,說明func數(shù)組的元素是函數(shù)類型的指針,它所指向的函數(shù)具有int*類型的形參,返回值類型為int。


            int?(*(*func)[5])(int?*p);

            func被一個圓括號包含,左邊又有一個*,那么func是一個指針,跳出括號,右邊是一個[]運(yùn)算符號,說明func是一個指向數(shù)組的指針,現(xiàn)在往左看,左邊有一個*號,說明這個數(shù)組的元素是指針,再跳出括號,右邊又有一個括號,說明這個數(shù)組的元素是指向函數(shù)的指針。總結(jié)一下,就是:func是一個指向數(shù)組的指針,這個數(shù)組的元素是函數(shù)指針,這些指針指向具有int*形參,返回值為int類型的函數(shù)。

            int?(*(*func)(int?*p))[5];

            func是一個函數(shù)指針,這類函數(shù)具有int*類型的形參,返回值是指向數(shù)組的指針,所指向的數(shù)組的元素是具有5個int元素的數(shù)組。

            要注意有些復(fù)雜指針聲明是非法的,例如:

            int?func(void)?[5];

            func是一個返回值為具有5個int元素的數(shù)組的函數(shù)。但C語言的函數(shù)返回值不能為數(shù)組,這是因?yàn)槿绻试S函數(shù)返回值為數(shù)組,那么接收這個數(shù)組的內(nèi)容的東西,也必須是一個數(shù)組,但C語言的數(shù)組名是一個右值,它不能作為左值來接收另一個數(shù)組,因此函數(shù)返回值不能為數(shù)組。

            int?func[5](void);

            func是一個具有5個元素的數(shù)組,這個數(shù)組的元素都是函數(shù)。這也是非法的,因?yàn)閿?shù)組的元素除了類型必須一樣外,每個元素所占用的內(nèi)存空間也必須相同,顯然函數(shù)是無法達(dá)到這個要求的,即使函數(shù)的類型一樣,但函數(shù)所占用的空間通常是不相同的。

            作為練習(xí),下面列幾個復(fù)雜指針聲明給讀者自己來解析,答案放在第十章里。

            int?(*(*func)[5][6])[7][8];

            int?(*(*(*func)(int?*))[5])(int?*);

            int?(*(*func[7][8][9])(int*))[5];

            ????????實(shí)際當(dāng)中,需要聲明一個復(fù)雜指針時,如果把整個聲明寫成上面所示的形式,對程序可讀性是一大損害。應(yīng)該用typedef來對聲明逐層分解,增強(qiáng)可讀性,例如對于聲明:

            int?(*(*func)(int?*p))[5];

            可以這樣分解:

            typedef??int?(*PARA)[5];
            typedef?PARA?(*func)(int?*);

            這樣就容易看得多了。

            posted on 2007-01-20 13:17 [HORSETAIL] 閱讀(188) 評論(0)  編輯 收藏 引用 所屬分類: C/C++語言編程綜合問題
            18岁日韩内射颜射午夜久久成人 | 一本久久免费视频| 亚洲精品NV久久久久久久久久| 无码人妻少妇久久中文字幕| 国产日产久久高清欧美一区| 2021久久精品国产99国产精品| 99久久精品费精品国产一区二区| 一级做a爰片久久毛片人呢| 欧美午夜精品久久久久久浪潮| 久久久久久精品免费免费自慰| 亚洲成色999久久网站| 伊人久久国产免费观看视频| 狠狠色丁香婷婷久久综合不卡| 中文字幕无码久久人妻| 婷婷综合久久中文字幕| 久久人人妻人人爽人人爽| 久久影院亚洲一区| 久久综合综合久久97色| 久久午夜无码鲁丝片| 久久婷婷国产剧情内射白浆 | 久久国产精品99久久久久久老狼| 久久无码一区二区三区少妇| 久久99国产精品一区二区| 国内精品久久久久久久久电影网| 精品久久久久中文字幕一区| www.久久热.com| 69久久夜色精品国产69| 亚洲国产精品无码久久久不卡| 老男人久久青草av高清| 久久无码人妻精品一区二区三区| 久久99精品国产一区二区三区 | 国产精品九九久久免费视频| 国内精品九九久久久精品| 亚洲精品乱码久久久久久久久久久久 | 久久久噜噜噜久久| 99久久无码一区人妻| 99久久精品九九亚洲精品| 国产福利电影一区二区三区久久老子无码午夜伦不 | 2021国产精品午夜久久| 亚洲国产视频久久| 7777精品久久久大香线蕉|