亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言 百分網(wǎng)手機(jī)站

C語言之復(fù)雜指針詳解

時間:2020-09-22 19:28:28 C語言 我要投稿

C語言之復(fù)雜指針詳解

  因?yàn)镃語言所有復(fù)雜的指針聲明,都是由各種聲明嵌套構(gòu)成的。如何解讀復(fù)雜指針聲明呢?右左法則是一個既著名又常用的方法。不過,右左法則其實(shí)并不是C標(biāo)準(zhǔn)里面的內(nèi)容,它是從C標(biāo)準(zhǔn)的聲明規(guī)定中歸納出來的方法。下面是小編為大家整理的C語言之復(fù)雜指針詳解,歡迎參考~

  在《C陷阱與缺陷》第二章第一節(jié)中有這樣一個聲明:

   (*(void(*)())0)();

   看到這樣的表達(dá)式估計(jì)讓不少人都“不寒而栗”了吧,其實(shí)雖然看起來復(fù)雜,但是構(gòu)造這類表達(dá)式其實(shí)只有一條簡單的規(guī)則:按照使用的方式來聲明。

  首先先介紹一個著名的解析法則:右左法則:首先從圓括號起,然后向右看,然后向左看,每當(dāng)遇到圓括號時,就調(diào)轉(zhuǎn)閱讀方向,當(dāng)括號內(nèi)的內(nèi)容解析完畢,就跳出這個括號,重復(fù)這個過程直到表達(dá)式解析完畢。

   其實(shí)我們發(fā)現(xiàn),所謂復(fù)雜指針離不開指針函數(shù),函數(shù)指針,指針數(shù)組,函數(shù)指針這四個概念并且括號,*比較多,其實(shí)只要我們仔細(xì)分析這些看起來復(fù)雜的表達(dá)式,其實(shí)他的邏輯也是很清晰的。

  舉個例子,使用右左法則解析復(fù)雜的表達(dá)式:

   Int *(*(*pfun)(int *))[10];

   用右左法則解析這個表達(dá)式,首先要找到未定義的標(biāo)識符pfun,當(dāng)往右看的時候遇到括號,于是調(diào)轉(zhuǎn)方向,再朝相反的方向看,pfun遇到了*,說明pfun是一個指針,再往左看又遇到了括號,因此又要調(diào)轉(zhuǎn)方向,遇到的是另外一個括號,因此說明指針?biāo)赶虻氖且粋函數(shù),函數(shù)的參數(shù)是一個整型指針。然后又向相反的方向看,又遇到了一個*,說明該函數(shù)的返回值又是一個指針,在往左看又遇到括號,所以再次調(diào)轉(zhuǎn)方向,把內(nèi)側(cè)的括號里的內(nèi)容看完,出了括號遇到的是數(shù)組,說明指針?biāo)赶虻?函數(shù)的返回值類型的指針指向的是數(shù)組,這有點(diǎn)向繞口令,但是還是有邏輯可循的。

   但是右左法則確實(shí)有點(diǎn)麻煩,我們這樣看上面這個表達(dá)式:首先fpun是一個指向函數(shù)的函數(shù)指針,該函數(shù)有一個整型指針類型的參數(shù)并且返回值也是一個指針,所返回的類型指向的是一個數(shù)組,并且這個數(shù)組有10個元素,每個元素是整型指針類型。

   接下來我們在回過頭來看文章最開始的那個表達(dá)式:

  (*(void(*)())0)();

   我們先看括號里面的內(nèi)容,首先0被強(qiáng)制轉(zhuǎn)換為一個返回值為void類型,沒有參數(shù)的函數(shù)的函數(shù)指針,指針(void)(*)()0)指向了一個函數(shù)。

   要想很好的解決這個問題,選擇使用typedef是一個很好的方式。

【C語言之復(fù)雜指針詳解】相關(guān)文章:

C語言指針用法詳解10-19

C語言指針函數(shù)和函數(shù)指針詳解06-10

C語言數(shù)組與指針詳解11-05

C++ this指針詳解10-01

C語言指針教學(xué)11-05

C語言中指針變量作為函數(shù)參數(shù)詳解11-20

C語言指針的用法10-05

C語言指針的傳遞10-06

C語言入門知識之字符串與指針10-22