宣告在c
語言程式設計過程中起著核心的作用,通過宣告變數和函式,可以檢查程式潛在的錯誤以及把程式翻譯成目標**兩方面為編譯器提供至關重要的資訊。
在宣告變數和函式上有許多共同點。此外宣告還為儲存期限,作用域,以及連線提供重要的堅實的基礎。
宣告如何構成:
說明符 乙個或多個宣告表示式;
說明符 描述宣告變數和函式的性質。
說明符組成符分為三大類:
儲存型別: 分為四種 auto static extern register
再宣告中最多可以出現一次儲存型別。 並且要放到最前面。
型別限定符: c89
中有 const
和 volatile c99
中還有
restrict
宣告可以有多個限定符。
型別說明符:void char short int long signed unsigned float double。
函式說明符:在c99
中出現它只用於函式宣告,關鍵字為
inline。
型別限定符和型別說明符必須放到儲存型別的後面。
宣告表示式:
對於簡單的型別,宣告表示式列表就是被宣告的標示符列表,對於更為複雜型別,宣告表示式的每個條目實際是乙個表示式。
宣告表示式的構成:
指標: 一般有 * const volatile
, * volatile ,*
,*const
,* volatile const
構成。
直接宣告器: 識別符號, 識別符號【下標】, 識別符號(引數),(宣告器)……。
初始化內容: =
初始值。
優先順序規則:
a 宣告從名字開始讀
b 按照優先順序從高到底
() 聚組
() 函式呼叫
【】下標引用
* 間接訪問
c 如果
const
或者 volatile
關鍵字後面緊跟型別說明符,那麼它作用於型別說明符。在其他情況下
const
和volatile
作用於他左邊緊鄰的指標星號
分析宣告:
int *fp( ); 函式指標 指標中解釋
int (* f ) ( ); 與
int * f[ ]( );
char * const * (
* next【9
】)();
非法:int f()()函式不能返回乙個函式 可以用
int(
* f())()
int f()
函式不能返回乙個陣列,因為函式必須返回標量值
int
(* f
())[ ];
int f【】()陣列不能儲存函式 因為陣列元素必須相同的長度
int
(* f[ ]
)( );
當計算機啟動時, 硬體將呼叫首位址為0
位置的子例程。
( *( void(* )()) 0 )( )
解釋 第一步:將0
進行強制型別轉化 (
void (*
)())0
然後引用這個0
位置中的函式 (*(
void (*
)())
0)() 就好像
fp是乙個函式指標 來引用
fp處的函式 (
*fp)()。
用 typedf
能使表達更清晰,
typedef void (* funcptr ) ( );
( *( funcptr )0)( );
參考書籍 《c專家程式設計》 《c語言現代方法》。 本人只是一枚大一的學生,希望寫的不足的地方,或者有補充的地方,有大牛們指出,謝謝。 或者加qq討論 2110551525
C語言之宣告和定義
1 先說 宣告 和 定義 的區別 這裡的物件泛指函式 變數等 宣告 只是簡單地告訴編譯器在其他地方建立的物件的名字,允許你使用這個名字,並不分配記憶體空間,以extern關鍵字標識。定義 是一種特殊的宣告,它在宣告的同時告訴編譯器為物件分配記憶體空間。c語言的物件必須有且只有乙個定義,但可以有多個e...
非原 c語言之宣告和定義的區別
什麼是定義?什麼是宣告?它們有何區別?舉個例子 12 a inti b externinti 關於extern,後面解釋 哪個是定義?哪個是宣告?或者都是定義或者都是宣告?我所教過的學生幾乎沒有一人能回答上這個問題。這個十分重要的概念在大學裡從來沒有被提起過!什麼是定義 所謂的定義就是 編譯器 建立...
C語言之extern宣告辨析
1 基本解釋 extern可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。另外,extern也可用來進行鏈結指定。2 問題 extern 變數 在乙個原始檔裡定義了乙個陣列 char a 6 在另外乙個檔案裡用下列語句進行了宣告 ex...