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