複雜聲明的分析過程
步驟號 匹配的符號 如何閱讀
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類型。
該方法總結起來就是,先找到標識符,然後前後判斷符號的優先級,找到"()"“*”“【】”其中一個組成一個新的“標識符”,然後在這個新的標識符的前後判斷符號的優先級,找到"()"“*”“【】”其中一個組成一個新的“標識符”,直到不能組合爲止。