一、c語言宣告的語法有時會帶來嚴重的問題
1、「物件宣告的形式和使用的形式盡可能相似」
1)、優點——各種操作符的優先順序在「宣告」和「使用」時是一樣的。
2)、缺點——操作符的優先順序設計不當、過於複雜。
2、無法以一種人們所習慣的自然方式從左到右閱讀乙個宣告,在ansi c加入volatile和const關鍵字後情況更糟。
1)、例項
a、const int * grape
b、 int const * grape
c、int * const grape_jeelly
d、const int * const grape_jam
e、 int const * const grape_jam
說明:a、b是一樣的,都表示指標所指向的物件是唯讀的,c表示指標式是唯讀的,d、e也是一樣的,都表示物件和指標都是唯讀的。
二、c語言宣告是如何形成的
1、c語言中的宣告器(p58表3-1)
2、c語言中的宣告(p59表3-2) 注意:並非所有的形式組合都是合法的
3、結構(struct)
1)、宣告——結構的內容可以是任何其他的資料宣告,單個資料項、陣列、其他結構、指標等。
b、引數在傳遞時首先盡可能地存放到暫存器中(追求速度)。
2)、結構中的陣列
4、聯合(union)
1)、宣告
2)、優點
a、可用來節省記憶體空間
b、把同乙個資料解釋成不同的資料定義。
5、列舉(enum)
1)、宣告
2)、優點
a、#define定義的名字一般在編譯時被丟棄,但列舉名字移植在偵錯程式可見,可以在除錯**中使用它們。
三、c語言優先順序規則(重點)
1)、理解c語言宣告的優先順序規則(p64)
2)、c優先順序直觀分析法(p65表3-1)
四、通過圖表分析c語言中的宣告(重點)
通過p65表3-1進行分析。
五、typedef相關
1、作用:為一種型別引入新的名字,而不是分配空間。
注意:不要為了方便起見對結構使用typedef。
2、typedef的缺點
1)、語法混亂,可以把幾個宣告塞到乙個宣告中去。
2)、在任何typedef宣告中,甚至不必把typedef放在宣告的開始位置。
3、與#define的區別
1)、#deifne可以用其他型別說明符對巨集型別名進行擴充套件,但對typedef所定義的型別名不能這樣做。
2)、在連續幾個變數的宣告中,用typedef定義的型別能夠保證宣告中的所有變數均為同一種型別,而用#define定義的型別無法保證。
4、typedef應用範圍
1)、陣列、指標、結構以及函式的組合型別。
2)、可移植型別。
3)、為後面的強制型別轉換提供乙個簡單的名字。
例:typedef int (*ptr_to_int_fun)(void);
char * p;......
=(ptr_to_int_fun) p
六、理解分析c語言宣告的**
《C專家程式設計》 分析C語言的宣告
一些比較容易搞混的宣告 char p 20 char p 20 第一種宣告由於的優先順序要高於 所以p先與結合表示p是乙個有20個元素的陣列,這個陣列的元素是指向char型別的指標 第二種宣告由於 的優先順序要高於,所以p先與 結合表示p是乙個指標,指向乙個有著20個char型別的元素的陣列 con...
C專家程式設計學習筆記 2
第4章 令人震驚的事實 陣列和指標並不相同 1.區別定義和宣告 宣告相當於普通的宣告 它所說明的並非自身,而是描述其他地方的建立的物件.定義相當於特殊的宣告 它為物件分配記憶體 2.當書寫了extern char p,然後用p 3 來引用其中的元素時,編譯器將會 1 取得符號表中p的位址,提取儲存與...
C專家程式設計學習筆記一
typedef和巨集文本替換的重要區別 首先,可以用其它型別說明符對巨集型別名進行擴充套件,但對typedef所定義的型別名卻不能這樣做。其次,在連續幾個變數的宣告中,用typedef定義的型別能夠保證宣告中所有的變數均為同一種型別,而用 define定義的型別則無法保證。編譯器位於編譯過程的哪乙個...