Android's Blog
學過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*
好像就這樣了,書上還有一幅圖,覺得也特形象,不過上傳了..有興趣可以下電子版看看<<c專家程式設計>>