如何理解c和c 的複雜型別宣告

2021-04-13 05:14:08 字數 2043 閱讀 9007

首先,讓我們看看指標與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個元素的陣列,每個元素都...