乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      函數(shù)指針的另類用法

       Gemmy 2007-03-23

      我曾經(jīng)和一些人聊過天,他們那時在書寫在一個小型的微處理器上單機運行的C程序。當這臺機器的開關(guān)打開的時候,硬件會調(diào)用地址為0處的子程序。 為了模仿電源打開的情形,我們要設(shè)計一條C語句來顯式地調(diào)用這個子程序。經(jīng)過一些思考,我們寫出了下面的語句: (*(void(*)())0)(); 這樣的表達式會令C程序員心驚膽戰(zhàn)。但是,并不需要這樣,因為他們可以在一個簡單的規(guī)則的幫助下很容易地構(gòu)造它:以你使用的方式聲明它。 每個C變量聲明都具有兩個部分:一個類型和一組具有特定格式的期望用來對該類型求值的表達式。最簡單的表達式就是一個變量:float f, g; 說明表達式f和g——在求值的時候——具有類型float。由于待求值的時表達式,因此可以自由地使用圓括號: float ((f)); 則表示((f))求值為float并且因此,通過推斷,f也是一個float。 同樣的邏輯用在函數(shù)和指針類型。例如: float ff(); 表示表達式ff()是一個float,因此ff是一個返回一個float的函數(shù)。類似地,float *pf;表示*pf是一個float并且因此pf是一個指向一個float的指針。這些形式的組合聲明對表達式是一樣的。因此float *g(), (*h)();表示*g()和(*h)()都是float表達式。由于()比*綁定得更緊密,*g()和*(g())表示同樣的東西:g是一個返回指 float指針的函數(shù),而h是一個指向返回float的函數(shù)的指針。 當我們知道如何聲明一個給定類型的變量以后,就能夠很容易地寫出一個類型的模型(cast):只要刪除變量名和分號并將所有的東西包圍在一對圓括號中即 可。因此,由于float *g();聲明g是一個返回float指針的函數(shù),所以(float *())就是它的模型。 有了這些知識的武裝,我們現(xiàn)在可以準備解決(*(void(*)())0)()了。 我們可以將它分為兩個部分進行分析。首先,假設(shè)我們有一個變量fp,它包含了一個函數(shù)指針,并且我們希望調(diào)用fp所指向的函數(shù)。可以這樣寫: (*fp)(); 如果fp是一個指向函數(shù)的指針,則*fp就是函數(shù)本身,因此(*fp)()是調(diào)用它的一種方法。(*fp)中的括號是必須的,否則這個表達式將會被分析為 *(fp())。我們現(xiàn)在要找一個適當?shù)谋磉_式來替換fp。 這個問題就是我們的第二步分析。如果C可以讀入并理解類型,我們可以寫(*0)(); 但這樣并不行,因為*運算符要求必須有一個指針作為他的操作數(shù)。另外,這個操作數(shù)必須是一個指向函數(shù)的指針,以保證*的結(jié)果可以被調(diào)用。因此,我們需要將 0轉(zhuǎn)換為一個可以描述“指向一個返回void的函數(shù)的指針”的類型。 如果fp是一個指向返回void的函數(shù)的指針,則(*fp)()是一個void值,并且它的聲明將會是這樣的void (*fp)();因此,我們需要寫 void (*fp)(); (*fp)();來聲明一個啞變量。一旦我們知道了如何聲明該變量,我們也就知道了如何將一個常數(shù)轉(zhuǎn)換為該類型:只要從變量的聲明中去掉名字即可。因此, 我們像下面這樣將0轉(zhuǎn)換為一個“指向返回void的函數(shù)的指針” (void(*)())0 接下來,我們用(void(*)())0來替換fp: (*(void(*)())0)(); 結(jié)尾處的分號用于將這個表達式轉(zhuǎn)換為一個語句。 在這里,我們就解決了這個問題時沒有使用typedef聲明。通過使用它,我們可以更清晰地解決這個問題: typedef void (*funcptr)(); (*(funcptr)0)();

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多