c語言學習冷知識點1:調用地址為0的函數
? ? ? ? 初學者看到(*(void (*)0)()會發(fā)怵,不知道在干什么,哪里會用到呢?怎么就調用了地址為0的函數?這么多層括號又如何去分析呢?......
? ? ? ? ? 這些問題可以暴露出你的基礎水平如何(函數調用,強制轉換,函數指針,指針操作),下面來慢慢分析,裝逼時刻到了??。
1.聲明一個函數如下:
? ? ? ? ? void fun();
函數地址為0x0000_0000,掉用它只需要寫fun();即可
2.函數指針寫法如下:
? ? ? ? ? void (*pfun)();
3.若要函數指針指向fun函數,fun函數地址為0,那就強轉fun為函數指針:
(void (*pfun)())fun?
pfun可以省略,fun被0替換,即0強轉為地址,指向fun函數如下:
(void (*)())0
4.調用0地址的函數如下:
(*(void(*)())0)();
(*(void(*)())0)取0地址中的函數后面再加一個()就調用了0地址的函數。
? ? ? ?新手或多或少會有些蒙,有些基礎的是不是覺得很神奇?當然編程老手肯定會說用typedef不就行了,弄這么花哨干什么?
? ? ? ?當然可以用typedef了,后面會分享給大家下一個知識點提到。
? ? ? ?我這是從?c和陷阱?這本書中看到,函數調用一篇中提到的,分享給大家我的學習心得,大家一起學習進步。如果有錯誤請大家及時指出,大家一起討論學習,思路和視野會開闊一些。感謝大家的支持,謝謝!
標簽: