1. 程式人生 > >Android's Blog

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專家程式設計>>