1. C和C++語言中的優先級規則
C語言中語言聲明的優先級規則如下(以後分析的基礎):
A 聲明從它的第一個名字開始讀取,然後按照優先級順序依次讀取
B 優先級從高到低依次是
B. 1 聲明中被括號括起來的那部分
B. 2 後綴操作符:
括號()表示這是一個函數
方括號[]表示這是一個數組
B. 3 前綴操作符:星號*表示“指向……的指針”
下面我們使用上述規則來分析以下例子
(1) char * const *(*next)();
(2) char* (*c[10])(int **p)
一步步分析:先分析括號裡面的內容,我們知道C是一個數組,保存的是“…..的指針”然後根據規則B,要先分析後綴,得到指針是一個函數指針。該函數參數為P返回值為char*。最後得到:C是一個數組元素,它的元素類型是函數指針,其所指向的函數的返回值是一個指向char的指針。
(3) void(*signal(int sig,void(*func)(int)))(int);
從signal所在的括號開始提取:void(*signal( ) )(int); 首先signal後綴跟的是括號,我們得到signal是一個函數, 然後得到前綴為* 表示此函數返回的是一個”……指針”…………最後得到signal是一個函數,返回函數指針,函數所指向的指針接受一個int類型的參數並且返回void。
然後我們看signal函數參數本身: void(*func)(int) 表示func是一個函數指針,此指針指向的函數接收一個int參數,返回值是void。
如果我們定義typedef void(*ptr_to_func)(int)則表示 ptr_to_func是一個函數指針,該函數接受一個int參數,返回值為void 那麼上述函數可以寫為
ptr_to_funcsignal(int sig, ptr_to_func); 表示 signal 是一個函數 ,接收參數為int和 ptr_to_func,返回ptr_to_func ;
2. typedef int x[10]與 #define x int[10]的區別
typedef與宏文本替換之間存在關鍵性的區別。如下:
第一: 可以用其他類型說明符對宏名進行擴展,但對typedef所定義的類型名卻不能這樣做。 如下:
#define peach int
unsigned peach i ; // 可以
typedef int banana;
unsigned banana i ; // 錯誤
第二:在連續聲明的變量中用typedef定義的類型能夠保證聲明中所有變量均同一種類型,而用#define定義的類型卻無法保證。 如下:
#define int_ptr int*
int_ptr chalk, cheese;
經過宏擴展,第二行變為:
int *chalk, cheese; 這使得chalk 與cheese為不同的類型。chalk為int類型的指針,而cheese只是int類型變量。
typedef char * char_ptr;
char_ptr Benley, Royce ; Benley,和Royce類型是相同的。都是指向char的指針
原因: #define在編譯時僅僅是名稱替換而typedef可以被看成一個徹底封裝的“類型”。在了解typedef 中變量具體表達什麼意思的時候可以按照前面說的優先級規則進行解析。
3. 指針與typedef
typedef中使用指針往往帶來意外的結果。例:
typedef string *pstring;
const pstring cstr;
c_str究竟代表什麼類型。我們知道pstring是指向string的指針很多人都會誤認為真正的類型是const string* cstr。錯誤原因是將typedef當成#define 直接進行文本擴展了,其實const修飾的是 pstring 而pstring是一個指針,因此,正確的等價形式應該是
string *const cstr;
--------------------------------------分割線 --------------------------------------
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中:
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-12/111046p2.htm