剖析複雜的c的宣告

2021-06-16 07:20:50 字數 1577 閱讀 7517

學過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 中介紹了兩種解...