c語言的申明總是令人頭大,對於這塊內容也一直讓我頭疼。希望通過這篇部落格能夠稍微梳理一下。材料和例子**於《c專家程式設計》先來個例子,看看下面這行c**到底是個啥玩意兒:
char
*const*(
*next)()
;
c 如果const和(或)volatile關鍵字的後面緊跟型別說明符(如int,long等),那麼它作用於型別說明符。在其它情況下,const和(或)volatile關鍵字作用於它緊鄰的指標星號。
首先,看變數名是「next」,並注意到它直接被括號括住(a)
把括號括住的東西看作乙個整體(*next),得出 「next是乙個指向…的指標」(b.1)
然後考慮括號外面的東西,在星號字首和括號字尾之間做出選擇:
b.2規則告訴我們優先順序較高的是右邊的函式括號,所以得出「next是乙個函式指標,指向乙個返回…的函式」(b.2)
然後,處理字首*號,得出指標所指的內容
最後,把「char * const」解釋為指向字元的常量指標
所以最後得出:next是乙個指標,它指向乙個函式,該函式返回另乙個指標,該指標指向乙個型別為char的常量指標。
雖然能夠搞明白,並且有規則可循。但還是不得不吐槽,c的申明也太複雜了。哎~~~
看系統呼叫signal函式的申明:
void(*
signal
(int sig,
void
(*func)
(int))
)(int)
;
先不看signal括號裡面的東西:
void(*
signal()
)(int)
;
可以看出來,signal是乙個函式,然後它返回乙個指標;該指標所指向的函式接受乙個int引數,並返回void。我們再來看signal括號裡面的東西,第乙個引數不用解釋,來看第二個引數:
void
(*func)
(int
)
不難看出func是乙個函式指標,指向的函式接受乙個int引數,返回void。接下來讓我們用typedef來簡化它:
/* ptr_ti_func是乙個函式指標,該函式接受乙個int引數,返回void。 */
typedef
void
(*ptr_to_func)
(int
)//接著再申明之前的那個signal
ptr_to_func signal
(int
, ptr_to_func)
;
#define只是做替換而已;而typedef是真正的封裝–申明它之後,不能再往裡面增加東西。舉兩個例子:
例子1:
#define myint int
usigned myint i;
//可以沒問題,就是文字替換而已:unsigned int i;
typedef
int myint;
usigned myint i;
//非法,不可以在myint裡面加usigned了。
例子2:
#define int_ptr int *
int_ptr a,b;
//a是int *型別,b是乙個int;
typedef
int* int_ptr;
int_ptr a,b;
//a和b都是int *型別。
最後想說一下作者本身對這個也只是初步了解,如有理解錯誤歡迎反饋!! c c 排坑 5 c語言中的申明
c語言的申明總是令人頭大,對於這塊內容也一直讓我頭疼。希望通過這篇部落格能夠稍微梳理一下。材料和例子 於 c專家程式設計 先來個例子,看看下面這行c 到底是個啥玩意兒 char const next c 如果const和 或 volatile關鍵字的後面緊跟型別說明符 如int,long等 那麼它作...
c c 排坑 2 c語言中的符號過載
所謂的符號過載就是在不同的上下文環境裡有不同的意義。甚至有些關鍵字也被過載而具有好幾種意義,這也是c語言的作用域規則對程式設計師不那麼清晰的主要原因。本章內容摘自 c專家程式設計 p37。符號意義 static 在函式內部,表示該變數的值在各個呼叫間一直保持延續性 在函式這一級,表示該函式只對本文可...
C 學習筆記(5) C語言與C 的區別
標頭檔案c語言 c stido.h iostream math.h cmath string.h cstring sdilib.h cstdlib 命名空間 重複的識別符號 using namespace std 使用std命名空間 std cout 註明cout來自於哪個命名空間 cout cin...