關(guān)于函數(shù)指針,一直都有一個(gè)爭(zhēng)論的話題:
通過(guò)函數(shù)指針調(diào)用函數(shù),需不需要加星號(hào)?
void func() { } void (*pf)() = func; pf(); (*pf)();同樣,獲取函數(shù)地址的時(shí)候,需不需要對(duì)函數(shù)名做取地址的操作?
void func() { } void (*pf)() = func; void(*pf)() = &func;先來(lái)說(shuō)下結(jié)論,不管是獲取函數(shù)地址,還是通過(guò)函數(shù)指針調(diào)用函數(shù),兩種寫法都可以,就用法上來(lái)說(shuō),沒有什么區(qū)別,初學(xué)者也不必過(guò)多糾結(jié)。
先來(lái)看下獲取函數(shù)地址。 我們?cè)谥暗?a target="_blank">視頻里面也講過(guò),函數(shù)名其實(shí)就是函數(shù)的入口地址,所以很多時(shí)候直接把函數(shù)名賦值給函數(shù)指針。
void(*pf)() = func;那加上取地址操作符又是什么意思?
void (*pf)() = &func;C和指針這本書中這樣解釋:
初始化表達(dá)式中的 & 操作符是可選的,因?yàn)楹瘮?shù)名被使用時(shí)總是由編譯器把它轉(zhuǎn)換成函數(shù)指針,取地址操作符只是顯示的說(shuō)明了編譯器將隱式執(zhí)行的任務(wù)。
這樣看來(lái),加不加取地址好像還真有點(diǎn)區(qū)別,一個(gè)表示函數(shù),一個(gè)表示函數(shù)的地址,只不過(guò)在這個(gè)賦值運(yùn)算中,編譯器把函數(shù)名轉(zhuǎn)換成了地址。
void (*pf)() = func; //函數(shù) void(*pf)()=&func;//函數(shù)的地址要說(shuō)他倆的區(qū)別,我能想到的就是結(jié)合sizeof來(lái)計(jì)算類型的長(zhǎng)度:
#include在64位系統(tǒng)中,這兩個(gè)的結(jié)果一個(gè)是1,一個(gè)是8。 不過(guò)需要注意的是,很多編譯器,不支持sizeof+函數(shù)名這種寫法。 接下來(lái)就是通過(guò)函數(shù)指針調(diào)用函數(shù),需不需要在指針前面加上星號(hào)?void test() { } int main() { printf("%lu ", sizeof(test)); printf("%lu ", sizeof(&test)); return 0; }
pf(); (*pf)();C陷阱與缺陷這本書中也有提到:
fp是個(gè)函數(shù)指針,*fp就是該指針?biāo)赶虻暮瘮?shù),所以(*fp)()就是調(diào)用函數(shù)的方式。C標(biāo)準(zhǔn)允許程序員將上式簡(jiǎn)寫為fp(),但是一定要記住這種寫法也只是一種簡(jiǎn)寫形式。
這么看來(lái),好像加上星號(hào)更合適一些。
通過(guò)函數(shù)指針調(diào)用函數(shù),加不加星號(hào),以及獲取函數(shù)的地址,需要使用 & 運(yùn)算符,這個(gè)跟對(duì)數(shù)組名的操作還不一樣。
對(duì)數(shù)組名取地址和不取地址含義完全不一樣,使用的時(shí)候也有很大的區(qū)別。但是對(duì)函數(shù)名取地址和不取地址,使用的時(shí)候基本沒有區(qū)別。
審核編輯:劉清
-
編譯器
+關(guān)注
關(guān)注
1文章
1623瀏覽量
49108 -
函數(shù)指針
+關(guān)注
關(guān)注
2文章
56瀏覽量
3778
原文標(biāo)題:對(duì)函數(shù)名取地址
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論