首先,讓我們看看指標與const結合的宣告:
const int *p; //p是指向常整形的指標
int const *p; //錯誤
int * const p; //p是指向整形的常指標
const int * const p; //p是指向常整形的常指標
怎麼樣?希望大家不會搞混吧,下面我會告訴大家如何去理解,但是寫到這裡,我突然想起const的一些東西,這裡先插個小插曲,-_-
const int fun();
int fun() const;
最後那個表示fun函式是常成員函式(c++類中),既fun函式不能修改類中的成員變數和成員函式,這個在大家學習mfc中會經常看到的,舉個例子:如hwnd getdlgitem(id) const;這裡就不詳細說下去了,大家知道這麼個事就行了。
回到主題,要想很清楚的理解宣告,
一、我們先從編譯器中的宣告器(declarator)說起,什麼是宣告器?簡單來說,宣告器就是識別符號和與它組合一起的任何指標、函式括號、陣列下標等(定義請參考《c專家程式設計》),合法的宣告存在以下的限制:
1、函式的返回值不能是個函式或陣列,所以fun()()和fun()是非法的
2、陣列裡不能有函式,所以fun()是非法的
二、優先順序規則
a、宣告從它的名字開始讀取,然後安裝優先順序從高到低讀取
b、優先順序高低順序:
b1、宣告中被括號括起來部分
b2、字尾操作符:()表示函式 表示陣列
b3、字首操作符:*表示指向...的指標
c、如果const和(或)volatile後面緊跟型別(如int等),則const和(或)volatile修飾型別,否則const和(或)volatile修飾緊跟在他們左邊的*指標。
根據上面的優先順序規則,我們來進行下面的練習:
char * const * (*p)();
1、根據a規則,從p入手,得到p是...;
2、根據b1規則,(*p),得到p是指標,指向...;
3、根據b2規則,()函式下標優先於*,所以(*p)(),得到p是指標,指向乙個函式,該函式返回...
4、根據c規則知道const是修飾它左邊的*不是右邊,所以右邊的*應該是函式的返回值,故得到p是指標,指向乙個函式,該函式返回另外乙個指標,該指標指向...
5、根據c規則知道指標指向乙個型別為char的常指標。
6、綜上述,得到p是指標,指向乙個函式,該函式返回另外乙個指標,而該指標指向乙個型別為char的常指標。
大功告成!!!!!
以下給出些練習,鞏固下,答案以後給:
1、char * (*array[10]) (int **p)
2、void (*signal(int sig, void(*fun)(int)))(int)
呵呵,相信大家對上面那些宣告也非常厭惡,那麼我們來找解決辦法吧,那就是使用typedef,比如對上面的練習中void (*signal(int sig, void(*fun)(int)))(int),用typedef來使用就是:typedef void (*ptr_to_fun)(int)
ptr_to_fun signal(int, ptr_to_fun)
這樣估計就清楚了吧!
說到這,有些朋友會說:能不能用#define來解決呢??很好,是可以的啦,但是不好,為什麼?很多朋友可能都知道了,因為#define只是簡單的符號替換,不進行型別檢查,另外一些如#define max ((x)>(y)?(x)
1、array是個陣列,該陣列的元素是指標,該指標指向乙個函式,這個函式的引數是指向指標的指標p,函式返回另外乙個指標,而這個指標又指向char型別。
2、fun是個函式指標,函式的引數是int,返回值是void,signal是個函式,其中乙個引數是int,另外乙個引數是fun,返回另乙個指向函式的指標,該函式引數為int,返回void(其實就是fun)
如何理解c和c 的複雜型別宣告
本文作者girlrong是網易廣州社群的c語言版 版主,這篇 文章被選在 精華區。很是不錯,不敢獨享!據說她樂於助人,虛心誠懇,頗受歡迎。只可惜現在已退隱江湖了。在最近學習c語言過程中,了解些前輩大牛的經驗看法 曾經碰到過讓你迷惑不解 類似於int fp1 int 10 這樣的變數宣告嗎?對上述 右...
C語言 複雜型別宣告
c語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是c標準裡面的內容,它是從c標準的宣告規定中歸納出來的方法。c標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用來解決如何辯識乙個宣告的,兩者可以說是相反的。右左...
C語言的一些複雜型別宣告
一些比較複雜的宣告例項 c primer plus中的例子 陣列後面的和函式名後面的 具有相同的優先順序,它們比 的優先順序高。都是從左往右結合。int board 8 8 int ptr 乙個指向指標的指標,每個元素都是乙個指向int的指標 int risk 10 內含10個元素的陣列,每個元素都...