學過c語言的應該都見過c中那些讓人糾結的宣告吧!
比如:
char * const *(*next)();
這麼糾結的宣告我想如果你不是高手級別的人,應該是不能一下就可以想到的吧,不管看官行不行,反正我不行,哈哈~~~
最近在看c專家程式設計,上面寫了關於這個應該是怎麼去剖析它,我覺得真的很不錯,應該推薦一下。
按照以下的步驟下去我覺得應該是很容易就解決的:
1.找到識別符號(所謂識別符號就是那種自己定義的,但不是變數的那種,比如上面的next的)
2.在這個過程中,你一定要牢記右邊的優先順序比左邊的高,所以一定是先看右邊再看左邊的
2.1 **識別符號的右邊,如果是(, 那麼就是表示識別符號是.....函式2.2 如果是[的話,表示識別符號是乙個....陣列
2.3 如果**右邊不是上述的情況就看左邊
2.3.1 如果左邊是*,這表示指向...的指標------>看完以後繼續往左邊看2.3.2 如果左邊是const,這就表示唯讀的----->看完以後繼續往左邊看
2.3.3 如果是(,那就表示你這個部分已經處理完了,然後回到第二步重新進行下面的分析
4.就是一些基本的資料型別,然後連起來就可以了
下面分析一下上面的那個**
1.首先我找到了那個next
2.我**右邊是),不符合我的定義
3.因為右邊不符合,所以我就看左邊,看到了*,所以next是乙個指向...的指標,然後再往左,發現直接就是(了,那就說明(*next)已經分析完,那麼我們回到第二步。
2.看右邊是(,也就表示了是乙個函式,然後(*next)()就處理完了
3.看左邊就是*,也就表明是乙個指向...的指標,繼續向左,檢視到的是const的,說明是唯讀的,後面就是乙個指向char的指標
可以翻譯成這樣,next是乙個指標,他指標函式,這個函式返回乙個指標,這個指標指向char的常量指標。
其實就是一層套一層的感覺,感覺和英語的從句很想。
對於const有乙個規定是如果在const後面直接跟著資料型別的話,那麼const就是修飾這個資料型別的,其他就是用來修飾它左邊最鄰近的*
下面是乙個書上沒有的,我在網上找的
int * (* (*fp1) (int) ) [10];
1.找到fp1
2.找右邊找不到,那就找左邊,發現fp1是乙個指向..的指標,再向左是( ,則表示(*fp1)這一部分完成
2.找右邊是乙個函式,那麼我們就只是fp1是乙個指標,這個指標指向的是乙個函式,這個函式的引數是int.
3.向左找,是*,這表示是乙個指向..的指標,然後(*(*fp1)(int))就完成了
2.再看右邊是乙個陣列,
3.再左邊就是乙個int*
那麼連來就是fp1是乙個指標,這個指標指向的是乙個函式,這個函式的引數是int.,它的返回型別是乙個陣列指標,而這個指標指向的陣列是乙個指標陣列,他的元素是int*
好像就這樣了,書上還有一幅圖,覺得也特形象,不過上傳了..有興趣可以下電子版看看<
複雜的宣告
int a 整型變數 int a 整型指標變數 int a 整型指標的指標變數 int a 10 整型陣列 int a 10 整型指標陣列 int a 10 陣列指標變數 int a int 函式指標變數 int a 10 int 函式指標陣列 int fp1 int 10 fp1 函式指標變數,指...
C語言的複雜宣告
typedef的作用是類似於宣告乙個變數,但是這個變數就代表了這種型別的別名。比如 typedef int p int 則p就是這樣一種函式指標的別名,這種函式的原型是 int func int 對於複雜指標的理解遵從右左法則,從最裡面的變數名開始理解,遇到括號改變閱讀方向。代表指標,代表函式,代表...
如何讀懂複雜的C宣告
如何讀懂複雜的c宣告 k r曾經承認 c語言宣告的語法有時會帶來嚴重的問題 的確,諸如 char const next char c 10 int p 之類的宣告晦澀難懂,讓人迷茫。還好,peter van der linden在它的經典著作 expert c programming 中介紹了兩種解...