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

函數(shù)指針的六個常見應用場景

評論