深入理解C中復(fù)雜聲明

C語言

最近看了幾天的 K&R 的< C程序設(shè)計語言 >第二版阅茶,當(dāng)讀到的第5.12章的復(fù)雜函數(shù)聲明時扭吁,我感覺腦袋不夠用了谅摄。之前雖然匆匆使用過幾次函數(shù)指針,闽寡。就像快排的一樣。雖說有點難度,但是當(dāng)時還是能看懂的。

快速排序


      /*      具體實現(xiàn)參見: < C程序設(shè)計語言 > P103           */
void qsort(void *v[], int left, int right, int (*comp)(void *, void *)) {
      //  ...         
}

int cmp(char* s1, char* s2) {
     //  ...   
}

void swap(void *v[], int i, int j) {
      //  ...   
}

這段代碼里面绸贡,comp為一個函數(shù)指針捧挺,在使用之前需要使其指向一個函數(shù),就像cmp函數(shù)摊溶。

int (*comp)(void *, void *);    //定義
comp = cmp霞玄;        //指向cmp函數(shù)

由于在C語言里面把void*當(dāng)做通用指針,所以在參數(shù)傳遞上使用了void*拉岁。以方便在以后需要排序其他類型對象時坷剧,只需要給出比較方法,既cmp函數(shù)喊暖,就可比較惫企。 但是在進(jìn)行比較的時候得把他轉(zhuǎn)換成原本的類型。書中介紹陵叽,在第一版時狞尔,也用char*做為通用指針。

復(fù)雜聲明


剛剛看的comp指針可能很容易明白巩掺,下面再看幾個例子

int *day[13];
void *comp();
void (*comp)();
char (*(*x())[])();
char (*(*x[3])())[5];

是不是只能認(rèn)識前三個偏序。不要緊,下面重點來了胖替。

右左法則

右左法則其實并不是C標(biāo)準(zhǔn)里面的內(nèi)容研儒,它是從C標(biāo)準(zhǔn)的聲明規(guī)定中歸納出來的方法。C標(biāo)準(zhǔn)的聲明規(guī)則独令,是用來解決如何創(chuàng)建聲明的端朵,而右左法則是用來解決如何辯識一個聲明的,兩者可以說是相反的记焊。

The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

右左法則:首先從最里面的圓括號看起逸月,然后往右看,再往左看遍膜。每當(dāng)遇到圓括號時碗硬,就應(yīng)該掉轉(zhuǎn)閱讀方向。一旦解析完圓括號里面所有的東西瓢颅,就跳出圓括號恩尾。重復(fù)這個過程直到整個聲明解析完畢。

網(wǎng)上有人說應(yīng)該是未定義的標(biāo)識符開始閱讀挽懦,而不是從括號讀起閱讀翰意。我試了一下,的確未定義的標(biāo)識符容易理解一些信柿。首先前三個就不說了冀偶,咱們直奔第四個。最后一個當(dāng)做一會閱讀完渔嚷,之后的一個練習(xí)进鸠,感興趣的朋友可以試試。

首先:一定得知道() / [] 的優(yōu)先級都大于*形病。

char (*(*x())[])();

step1: x()                      右看
    x是一個函數(shù)
    
step2: *x()                     左看
    x是一個函數(shù)客年,該函數(shù)返回一個指針
    
step3: (*x())[]                 右看
    x是一個函數(shù),該函數(shù)返回一個指針漠吻,這個指針指向一個數(shù)組
    
step4: *(*x())[]                左看
    x是一個函數(shù)量瓜,該函數(shù)返回一個指針,這個指針指向一個數(shù)組途乃,該數(shù)組為指針數(shù)組
    
step5:(*(*x())[])()             右看
    x是一個函數(shù)绍傲,該函數(shù)返回一個指針,這個指針指向一個數(shù)組耍共,該數(shù)組為指針數(shù)組烫饼,每個指針為
    函數(shù)指針
    
step6:char (*(*x())[])()        左看
    x是一個函數(shù),該函數(shù)返回一個指針划提,這個指針指向一個數(shù)組枫弟,該數(shù)組為指針數(shù)組,每個指針為
    函數(shù)指針鹏往,函數(shù)返回char類型淡诗。

其實實際中很少使用到過于復(fù)雜的聲明,如果實在是用到復(fù)雜的聲明伊履,都會使用typedef進(jìn)行合成韩容。

char (*(*x())[])();

typedef *x() per1;
typedef *(per1)[] per2Arr;
char (per2Arr)();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唐瀑,隨后出現(xiàn)的幾起案子群凶,更是在濱河造成了極大的恐慌,老刑警劉巖哄辣,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件请梢,死亡現(xiàn)場離奇詭異赠尾,居然都是意外死亡,警方通過查閱死者的電腦和手機毅弧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門气嫁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人够坐,你說我怎么就攤上這事寸宵。” “怎么了元咙?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵梯影,是天一觀的道長。 經(jīng)常有香客問我庶香,道長甲棍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任脉课,我火速辦了婚禮救军,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倘零。我一直安慰自己唱遭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布呈驶。 她就那樣靜靜地躺著拷泽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袖瞻。 梳的紋絲不亂的頭發(fā)上司致,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音聋迎,去河邊找鬼脂矫。 笑死,一個胖子當(dāng)著我的面吹牛霉晕,可吹牛的內(nèi)容都是我干的庭再。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺堰,長吁一口氣:“原來是場噩夢啊……” “哼拄轻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伟葫,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恨搓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斧抱,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡常拓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了夺姑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墩邀。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡掌猛,死狀恐怖盏浙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荔茬,我是刑警寧澤废膘,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站慕蔚,受9級特大地震影響丐黄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孔飒,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一灌闺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坏瞄,春花似錦桂对、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缀棍,卻和暖如春宅此,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爬范。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工父腕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人青瀑。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓璧亮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狱窘。 傳聞我的和親對象是個殘疾皇子杜顺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容