在分享這些進階聲明之前,我想,大家有必要知道各個操作符在C、C++語言中的優先級,以便識别欲講述的進階聲明。
這裡先列舉一些進階聲明的例子,能自己揣摩清楚最好不過了,如果有想不懂的地方,請參見下方的識别方法。
複制内容到剪貼闆
<code>int f; //聲明f為一整型變量 int *f; //聲明f為一指向整型的指針 int *f,g; //聲明f為指向整型的指針,g為整型變量 int f(); //聲明f為傳回值類型是int的函數 int *f(); //聲明f為一函數,傳回類型是指向整型的指針 int (*f)(); //聲明f是指針,指向傳回值為整型的函數 int *(*f)(); //聲明f是指針,指向函數,函數傳回類型是指向整型的指針 int *(*f)[]; //聲明f是指針,它指向元素為整形指針的指針數組 int **f(); //聲明f是一個函數,函數的傳回值是一個指向整型指針的指針 int *(*f())(); //聲明f是函數,函數傳回類型是某種指針,該指針指向傳回類型為整型指針的函數 int (**(*f)())(); //聲明f是指針,它指向某個函數,該函數傳回類型是指向另一傳回值為整型的函數的指針的指針 int f[]; //聲明f是數組,數組元素是整型 int *f[]; //聲明f是數組,數組元素是指向整型的指針 int **f[]; //聲明f是數組,元素是指向整型指針的指針 int (*f)[]; //聲明f是指針,它指向一個整型數組 int f()[]; //非法聲明,函數不能傳回數組 int f[](); //非法聲明,數組的元素不能是函數 int (*f[])(); //聲明f是一個數組,數組元素是某種類型的指針,這些指針指向傳回值為整型的函數,即f是一個元素為指向傳回值是整型的函數的指針的數組 int *(*f[])(); //聲明f是一個數組,數組元素為某種類型的指針,這些指針指向的是函數,這些函數傳回值類型為指向整型的指針 int **(*f[6])(); //聲明f是一個擁有6個元素的數組,它的元素是:某種類型的指針,這些指針指向的是函數,函數傳回值是一個指向整型指針的指針 int (*(*f)())[]; //聲明f是一個指針,指向函數,該函數傳回值為指針,它指向一整型數組 int *(*(*(*f)())[])(); //聲明f是一函數指針,該函數傳回一指針,該指針指向數組,數組元素是指針,那些指針指向傳回值類型為整型指針的函數 int (*f)(int,float); //聲明f是一函數指針,它指向一個接受兩個參數的函數,函數傳回值類型是整型 int *(*g[])( int, float ); //聲明g是一個元素為指針的數組,這些指針指向一個函數,函數接受兩個參數,傳回值類型為指向整型的指針</code>
【識别指針進階聲明的方法】
明确各操作符的優先級,然後按優先級(若優先級相同則按結合性判斷)順序識别即可(若有括号,首先結合括号内的操作符),例如:
<code>例子① int *(*f)(); /*** * 步驟: * ①操作符有:解引用操作符 * 函數調用操作符 () * ②優先級順序 () > * * ③解讀int *(*f)(); * 由于括号的作用,f首先是一個指針,然後由于函數調用操作符優先于解引用操作符 * 是以f是一個指向函數的指針,最後該函數的傳回類型為 int * * 最終結果: * f是一個指向傳回類型為 int * 型函數的函數指針 ***********************************************************************/ 例子② int (*(*f)())[]; /*** * 步驟: * ①操作符有:解引用操作符 * 函數調用操作符 () 下标操作符 [] * ②優先級順序 () == [] > * * ③解讀int (*(*f)())[] * 由于括号的作用,f首先是一個指針,然後由于函數調用操作符優先于解引用操作符 * 是以f是一個指向函數的指針,由于外層括号的作用,得到最終結果 * f是一個函數指針 * 該指針指向一個函數 * 該函數的傳回類型為一個指向整形數組的指針 *********************************************************************/ 例子③ int *(*(*(*f)())[])(); 相信大家根據以上兩個例子能推出這個聲明的含義了吧,其實就是一層一層的往外面走就是了 最終結果: 聲明f是一函數指針,該函數傳回一指針,該指針指向數組,數組元素是指針,這些元素指向傳回值類型為整型指針的函數</code>
本文轉自Bill_Hoo 51CTO部落格,原文連結:http://blog.51cto.com/billhoo/642618,如需轉載請自行聯系原作者