<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 134,comments - 22,trackbacks - 0

    C 語言所有復雜的指針聲明,都是由各種聲明嵌套構成的。如何解讀復雜指針聲明呢?右左法則是一個既著名又常用的方法。不過,右左法則其實并不是C 標準里面的內容,它是從C 標準的聲明規定中歸納出來的方法。C 標準的聲明規則,是用來解決如何創建聲明的,而右左法則是用來解決如何辯識一個聲明的,兩者可以說是相反的。右左法則的英文原文是這樣說的:
     
            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.  
     
     
    這段英文的翻譯如下:
     
             右左法則:首先從最里面的圓括號看起,然后往右看,再往左看。每當遇到圓括號時,就應該掉轉閱讀方向。一旦解析完圓括號里面所有的東西,就跳出圓括號。重復這個過程直到整個聲明解析完畢。
     
    筆者要對這個法則進行一個小小的修正,應該是從未定義的標識符開始閱讀,而不是從括號讀起,之所以是未定義的標識符,是因為一個聲明里面可能有多個標識符,但未定義的標識符只會有一個。
     
      現在通過一些例子來討論右左法則的應用,先從最簡單的開始,逐步加深:
     
    int   (*func)(int   *p);
     
    首先找到那個未定義的標識符,就是func ,它的外面有一對圓括號,而且左邊是一個* 號,這說明func 是一個指針,然后跳出這個圓括號,先看右邊,也是一個圓括號,這說明(*func) 是一個函數,而func 是一個指向這類函數的指針,就是一個函數指針,這類函數具有int* 類型的形參,返回值類型是int 。
     
    int   (*func)(int   *p,   int   (*f)(int*));
     
    func 被一對括號包含,且左邊有一個* 號,說明func 是一個指針,跳出括號,右邊也有個括號,那么func 是一個指向函數的指針,這類函數具有int   * 和int   (*)(int*) 這樣的形參,返回值為int 類型。再來看一看func 的形參int   (*f)(int*) ,類似前面的解釋,f 也是一個函數指針,指向的函數具有int* 類型的形參,返回值為int 。
     
    int   (*func[5])(int   *p);
     
    func 右邊是一個[] 運算符,說明func 是一個具有5 個元素的數組,func 的左邊有一個* ,說明func 的元素是指針,要注意這里的* 不是修飾func 的,而是修飾func[5] 的,原因是[] 運算符優先級比* 高,func 先跟[] 結合,因此* 修飾的是func[5] 。跳出這個括號,看右邊,也是一對圓括號,說明func 數組的元素是函數類型的指針,它所指向的函數具有int* 類型的形參,返回值類型為int 。
      int   (*(*func)[5])(int   *p);
     
    func 被一個圓括號包含,左邊又有一個* ,那么func 是一個指針,跳出括號,右邊是一個[] 運算符號,說明func 是一個指向數組的指針,現在往左看,左邊有一個* 號,說明這個數組的元素是指針,再跳出括號,右邊又有一個括號,說明這個數組的元素是指向函數的指針??偨Y一下,就是:func 是一個指向數組的指針,這個數組的元素是函數指針,這些指針指向具有int* 形參,返回值為int 類型的函數。
     
    int   (*(*func)(int   *p))[5];
     
    func 是一個函數指針,這類函數具有int* 類型的形參,返回值是指向數組的指針,所指向的數組的元素是具有5 個int 元素的數組。
     
    要注意有些復雜指針聲明是非法的,例如:
     
    int   func(void)   [5];
     
    func 是一個返回值為具有5 個int 元素的數組的函數。但C 語言的函數返回值不能為數組,這是因為如果允許函數返回值為數組,那么接收這個數組的內容的東西,也必須是一個數組,但C 語言的數組名是一個右值,它不能作為左值來接收另一個數組,因此函數返回值不能為數組。
     
    int   func[5](void);
     
    func 是一個具有5 個元素的數組,這個數組的元素都是函數。這也是非法的,因為數組的元素除了類型必須一樣外,每個元素所占用的內存空間也必須相同,顯然函數是無法達到這個要求的,即使函數的類型一樣,但函數所占用的空間通常是不相同的。
     
    作為練習,下面列幾個復雜指針聲明給讀者自己來解析,答案放在第十章里。
     
    int   (*(*func)[5][6])[7][8];
     
    int   (*(*(*func)(int   *))[5])(int   *);
     
    int   (*(*func[7][8][9])(int*))[5];
     
             實際當中,需要聲明一個復雜指針時,如果把整個聲明寫成上面所示的形式,對程序可讀性是一大損害。應該用typedef 來對聲明逐層分解,增強可讀性,例如對于聲明:
     
    int   (*(*func)(int   *p))[5];
     
    可以這樣分解:
     
    typedef     int   (*PARA)[5];
    typedef   PARA   (*func)(int   *);
     
    這樣就容易看得多了。 


    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xiaojianpitt/archive/2009/10/30/4748427.aspx

    posted on 2010-05-04 21:33 何克勤 閱讀(181) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 日韩视频免费一区二区三区| 四虎免费影院ww4164h| 又大又粗又爽a级毛片免费看| 亚洲中文字幕无码爆乳| 四虎免费在线观看| 欧洲亚洲国产精华液| 国产精品成人四虎免费视频| 亚洲av色香蕉一区二区三区| 国产在线观看免费不卡| 九九免费观看全部免费视频| 在线亚洲97se亚洲综合在线| 两个人看的www高清免费视频| 久久精品亚洲中文字幕无码网站 | 成年女人免费视频播放体验区 | 菠萝菠萝蜜在线免费视频| 亚洲av无码成人精品区| 久久www免费人成精品香蕉| 亚洲熟妇av一区二区三区| a级男女仿爱免费视频| 亚洲成在人线电影天堂色| A在线观看免费网站大全| 亚洲妇女无套内射精| 亚洲AⅤ无码一区二区三区在线 | 国产亚洲人成网站在线观看不卡| 久久精品视频免费播放| 亚洲成a人片在线观看中文!!!| 成人免费视频试看120秒| h视频免费高清在线观看| 久久精品亚洲综合专区| 午夜神器成在线人成在线人免费| 免费国产黄网站在线观看动图| 亚洲av中文无码乱人伦在线播放 | 国产99视频精品免费视频7| 九九久久国产精品免费热6| 亚洲综合一区二区精品导航| 日本久久久免费高清| 成人A片产无码免费视频在线观看| 亚洲一区二区三区播放在线| 亚洲色偷偷综合亚洲AV伊人| 永久免费在线观看视频| 美女视频免费看一区二区|