以前只知道函數指針怎麼使用,但是細節就不太瞭解,這裏總結下
和其他指針一樣,函數指針執行間接訪問之前必須把它初始化爲指向某個函數。
函數名被使用時總是由編譯器把它轉換爲函數指針。
#include<stdio.h>
int fun(int a)
{
printf("Happy %dth birthday\n",a);
return a;
}
int main(void)
{
int (*pf)(int ) = &fun;
//&操作符不一定要,這只是顯示地說明編譯器將隱式執行的任務。
int iYearsOld ;
iYearsOld = fun(18);
iYearsOld = (*pf)(19);
iYearsOld = pf(20);
}
一.直接使用fun名調用,函數名fun首先被轉換爲一個函數指針,指針確定函數在內存中的位置。然後函數調用操作符調用該函數,執行開始於這個地址的代碼。
二.對pf執行間接訪問操作,把函數指針轉換爲一個函數名。這樣轉換並不是真正需要的,因爲編譯器在執行函數調用操作符之前又會把它轉換回去,這條語句效果等同於第一條。
三.第三條語句等同於前二條。
編譯結果:
在《C和指針》P261頁有更詳細的內容。