3 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
#include <stdio.h>
void function1()
{
printf("bt!\n");
}
void (*p)();
void * Function()
{
void (*q)() = function1;
return q;
}
int main()
{
*(int*)&p=(int)Function();
p();
}

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
Function()是干什么?執(zhí)行Function函數(shù),該函數(shù)的返回值是什么?天知道!
但是(int)將函數(shù)執(zhí)行的結(jié)果轉(zhuǎn)換為了整形。
我們先拋開p的原始類型不談,看表達(dá)式*(int*)&p,首先將變量p的首地址轉(zhuǎn)換為整型指針,然后對(duì)其求其指向的內(nèi)容,最后的結(jié)果就是將p變量首地址開始的存儲(chǔ)空間被視為一個(gè)int整數(shù)。后面的代碼就是把一個(gè)int整數(shù)寫入到p的首地址開始的一個(gè)int型變量應(yīng)該占用的空間內(nèi)。
然后再看p,p是函數(shù)指針變量,最后的結(jié)果就是Function()執(zhí)行后的結(jié)果,被存放到了p變量開始的一個(gè)int整型的空間內(nèi)。我們考慮指針和整型的空間大小一樣,如果Function()的返回是一個(gè)函數(shù)指針,那這里就沒有信息丟失和轉(zhuǎn)換。最后p()調(diào)用函數(shù)。
這個(gè)轉(zhuǎn)換過程的結(jié)果就是,不管Function返回的是什么,都把這個(gè)返回值做為一個(gè)“void (*p)()”類型的函數(shù)來(lái)對(duì)待,并調(diào)用這個(gè)函數(shù)。
注意Function()函數(shù)的指針是Function,而不是Function()。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
void (*p)();
*(int*)&p=(int)Function; /* 去掉括號(hào) */
p();
實(shí)際上就是通過p調(diào)用了Function函數(shù)
- 3 回答
- 0 關(guān)注
- 1227 瀏覽
添加回答
舉報(bào)