免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

我曾經(jīng)和一些人聊過天,他們那時(shí)在書寫在一個(gè)小型的微處理器上單機(jī)運(yùn)行的C程序。當(dāng)這臺(tái)機(jī)器的開關(guān)打開的時(shí)候,硬件會(huì)調(diào)用地址為0處的子程序。為了模仿電源打開的情形,我們要設(shè)計(jì)一條C語句來顯式地調(diào)用這個(gè)子程序。經(jīng)過一些思考,我們寫出了下面的語句: (*(void(*)())0)();這樣的表達(dá)式會(huì)令C程序員心驚膽戰(zhàn)。但是,并不需要這樣,因?yàn)樗麄兛梢栽谝粋€(gè)簡(jiǎn)單的規(guī)則的幫助下很容易地構(gòu)造它:以你使用的方式聲明它。每個(gè)C變量聲明都具有兩個(gè)部分:一個(gè)類型和一組具有特定格式的期望用來對(duì)該類型求值的表達(dá)式。最簡(jiǎn)單的表達(dá)式就是一個(gè)變量:float f, g;說明表達(dá)式f和g——在求值的時(shí)候——具有類型float。由于待求值的時(shí)表達(dá)式,因此可以自由地使用圓括號(hào): float ((f));則表示((f))求值為float并且因此,通過推斷,f也是一個(gè)float。 同樣的邏輯用在函數(shù)和指針類型。例如: float ff();表示表達(dá)式ff()是一個(gè)float,因此ff是一個(gè)返回一個(gè)float的函數(shù)。類似地,float*pf;表示*pf是一個(gè)float并且因此pf是一個(gè)指向一個(gè)float的指針。這些形式的組合聲明對(duì)表達(dá)式是一樣的。因此float *g(),(*h)();表示*g()和(*h)()都是float表達(dá)式。由于()比*綁定得更緊密,*g()和*(g())表示同樣的東西:g是一個(gè)返回指float指針的函數(shù),而h是一個(gè)指向返回float的函數(shù)的指針。當(dāng)我們知道如何聲明一個(gè)給定類型的變量以后,就能夠很容易地寫出一個(gè)類型的模型(cast):只要?jiǎng)h除變量名和分號(hào)并將所有的東西包圍在一對(duì)圓括號(hào)中即可。因此,由于float *g();聲明g是一個(gè)返回float指針的函數(shù),所以(float *())就是它的模型。有了這些知識(shí)的武裝,我們現(xiàn)在可以準(zhǔn)備解決(*(void(*)())0)()了。我們可以將它分為兩個(gè)部分進(jìn)行分析。首先,假設(shè)我們有一個(gè)變量fp,它包含了一個(gè)函數(shù)指針,并且我們希望調(diào)用fp所指向的函數(shù)??梢赃@樣寫:(*fp)();如果fp是一個(gè)指向函數(shù)的指針,則*fp就是函數(shù)本身,因此(*fp)()是調(diào)用它的一種方法。(*fp)中的括號(hào)是必須的,否則這個(gè)表達(dá)式將會(huì)被分析為*(fp())。我們現(xiàn)在要找一個(gè)適當(dāng)?shù)谋磉_(dá)式來替換fp。 這個(gè)問題就是我們的第二步分析。如果C可以讀入并理解類型,我們可以寫(*0)();但這樣并不行,因?yàn)?運(yùn)算符要求必須有一個(gè)指針作為他的操作數(shù)。另外,這個(gè)操作數(shù)必須是一個(gè)指向函數(shù)的指針,以保證*的結(jié)果可以被調(diào)用。因此,我們需要將0轉(zhuǎn)換為一個(gè)可以描述“指向一個(gè)返回void的函數(shù)的指針”的類型。如果fp是一個(gè)指向返回void的函數(shù)的指針,則(*fp)()是一個(gè)void值,并且它的聲明將會(huì)是這樣的void(*fp)();因此,我們需要寫 void (*fp)();(*fp)();來聲明一個(gè)啞變量。一旦我們知道了如何聲明該變量,我們也就知道了如何將一個(gè)常數(shù)轉(zhuǎn)換為該類型:只要從變量的聲明中去掉名字即可。因此,我們像下面這樣將0轉(zhuǎn)換為一個(gè)“指向返回void的函數(shù)的指針” (void(*)())0 接下來,我們用(void(*)())0來替換fp:(*(void(*)())0)(); 結(jié)尾處的分號(hào)用于將這個(gè)表達(dá)式轉(zhuǎn)換為一個(gè)語句。在這里,我們就解決了這個(gè)問題時(shí)沒有使用typedef聲明。通過使用它,我們可以更清晰地解決這個(gè)問題: typedef void(*funcptr)(); (*(funcptr)0)();
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
(*(void(*)())0) ();
void (*b[10]) (void (*)());
詳解C/C++函數(shù)指針聲明
C陷阱和缺陷學(xué)習(xí)筆記
C語言陷阱和缺陷
深入理解C語言中的函數(shù)聲明
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服