c c 排坑 5 c語言中的申明

2022-08-15 01:45:08 字數 1676 閱讀 9964

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...