• <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>
            隨筆 - 0  文章 - 0  trackbacks - 0
            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿

            文章檔案(4)

            c 相關(guān)

            friends

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 782
            • 排名 - 2475

            最新隨筆

            最新評(píng)論

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

            ?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.


            ?這段英文的翻譯如下:

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

            ?int?func[5](void);

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

            ?????????作為練習(xí),下面列幾個(gè)復(fù)雜指針聲明給讀者自己來(lái)解析。

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

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

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

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

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

            ?可以這樣分解:

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

            ?這樣就容易看得多了。?
            ??

            ??

            ?答案,同時(shí)給出用typedef的分解方法:


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

            ?func是一個(gè)指向數(shù)組的指針,這類數(shù)組的元素是一個(gè)具有5X6個(gè)int元素的二維數(shù)組,而這個(gè)二維數(shù)組的元素又是一個(gè)二維數(shù)組。

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


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

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

            ?typedef?int?(*PARA1)(int*);
            ?typedef?PARA1?(*PARA2)[5];
            ?typedef?PARA2?(*func)(int*);

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

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

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


            ?

            posted on 2006-10-26 20:21 天性如此 閱讀(72) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            国产成人AV综合久久| 久久亚洲2019中文字幕| 精品久久久久久国产潘金莲| 久久99国内精品自在现线| 国内精品九九久久久精品| 久久综合九色综合久99| 久久精品无码一区二区三区免费| 亚洲精品国产第一综合99久久| 日韩人妻无码一区二区三区久久| 国产精品久久久久无码av| 久久精品一区二区三区中文字幕| 久久99热这里只有精品国产| 女人高潮久久久叫人喷水| 日韩人妻无码精品久久久不卡| 国产精品美女久久久久AV福利 | 久久久久一本毛久久久| 一本一本久久a久久综合精品蜜桃| 日韩一区二区久久久久久 | 欧美亚洲国产精品久久蜜芽| 久久人妻少妇嫩草AV蜜桃| 久久91精品国产91久久户| 久久成人小视频| 久久精品国产精品亜洲毛片| 国内精品久久国产大陆| 国产成人无码精品久久久性色| 久久久久久噜噜精品免费直播| 国产精品久久久久久久| 精品乱码久久久久久久| 一本久久a久久精品vr综合| 免费精品国产日韩热久久| 久久久久亚洲精品中文字幕| 精品国产91久久久久久久a | 国产巨作麻豆欧美亚洲综合久久| 国产精品久久久久久福利漫画 | 香蕉99久久国产综合精品宅男自| 亚洲国产成人久久精品影视| 国产精品久久久久久一区二区三区| 久久综合给合久久狠狠狠97色69| 精品熟女少妇av免费久久| 久久精品毛片免费观看| 国产综合久久久久|