複雜聲明的分析過程

複雜聲明的分析過程

步驟號                             匹配的符號                                    如何閱讀

1取最左邊的標識符              標識符                                          表示“標識符是”

2 查看標識符右邊的下一個

符號,如果是【】                【元素個數等數組參數】                對於每一對,表示“……的數組”

3 如果是一個左括號

表示                                    可能的參數                                   到右括號爲止的內容“返回……的函數”

4 如果左邊的符號是(             已經處理的內容                            這個左括號把已經處理的部分組合在一起,直到遇見相應的右括號,

                                                                                               然後從第2步從新開始

5.如果左邊 的符號是

const                                    const                                       繼續向左邊讀符號,直到讀的符合不是3個之一。

volatile                                  volatile                                              volatile   const表示“只讀”

*                                               *                                              *表示“指向……的指針”然後重複第4步



6剩下的符號形成聲明的基本類型  基本類型                                    可一併閱讀,如static unsigned int          


舉例說明:

(1) char **argv

找到標識符“argv",右邊沒有符號,左邊第一個爲“*”,說明“argv”是一個指針,然後繼續往前,又是一個“*”,說明“argv"是一個指向指針的指針,繼續往前是”char",那麼改聲明的含義爲“argv是一個指針,它指向一個指向char類型的指針”

(2) int (*daytab)[13]
第一步找到標識符"daytab",右邊第一個爲右括號,找到左邊第一個左括號,將括號裏面的結合起來,括號中daytab右邊沒有符號,左邊第一個符合,爲“*”,說明daytab是一個指針,然後跳出括號,繼續往右,是“【13】,說明是指向一個”有13個元素的數組“,然後向左,”int“,結合起來,該聲明的含義”daytab是一個指針,它指向一個有13個元素的數組,數組的元素爲整型數據“

(3) int *daytab[13]

找到左邊第一個標識符“daytab",向右第一個爲[13],而且【】優先級高於*,說明daytab是一個含有13個元素到數組,往前是"*,說明數組的元素是指針,指向什麼呢,然後往前讀到int,說明”daytab是一個含有13個元素的數組,數組的元素爲指向int型數據的指針“

(4) void *comp()

找到左邊第一個標識符“comp",右邊的括號優先級高於*,說明comp是一個函數,下一個是*,說明函數的返回值是指針,什麼指針呢,往前是void,”comp是一個函數,函數返回到是空指針“

(5)void (*comp)()

找到標識符“comp”,右邊是右括號,往左是"*“,說明comp是個指針,往左找到左括號,然後跳出括號往右,是”()“說明,comp是指向一個函數,往左是void,函數的返回值爲空

(6)char (*(*x())[])()

找到標識符‘x'.右邊第一個爲()說明"x"首先是一個函數,往左“*”,說明是函數的返回值是指針,往右是右括號,往左找到左括號,跳出括號,往右是【】,說明函數的返回值的指針是指向一個數組,什麼樣到數組呢,繼續往右是),往左是*,說明數組的元素是指針,之前找到右括號,那麼肯定有對應的左括號,跳出括號,右邊是(),說明數組元素的指針指向的是函數,什麼函數?“char",結合起來就是”x是一個函數,函數的返回值是一個指向數組元素爲指向返回char類型函數的指針的指針“更詳細的說法“x是一個函數,函數的返回值是一個指針,該指針指向一個數組,被指向數組的元素又是一個指針,這個指針指向返回值爲char的函數”

(7)char (*(*x[3])())[5]

找到標識符x,【】優先級高於*,說明x首先是個數組,數組的元素的個數爲3,該讀“*",元素的特徵是指針,遇到一個括號,跳出括號,右邊是(),說明數組中的指針指向函數,什麼函數前面讀到指針,說明函數的返回值是一個指針,指針指向哪?跳出第一個(),讀到”【5】“說明指向的是一個5個元素的數組,什麼元素的數組,往前一看是char,結合起來就是”x是一個3個元素的數組,數組中的元素是一個指針,該指針指向一個函數,函數的返回值又是另一個指針,這個指針指向一個5個元素的數組,數組的元素是char類型。

該方法總結起來就是,先找到標識符,然後前後判斷符號的優先級,找到"()"“*”“【】”其中一個組成一個新的“標識符”,然後在這個新的標識符的前後判斷符號的優先級,找到"()"“*”“【】”其中一個組成一個新的“標識符”,直到不能組合爲止。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章