函數指針指向代碼區,普通指針指向數據區。函數指針定義如下:
返回類型 (*函數指針變量)(參數表)
例如,void (*pf)()指向形如void f()這樣的函數。
使用函數指針的例子:
void open();//對幾個函數聲明
void print();
void exit();
void (*pfs[])()={open,print,exit};//函數指針數組
int main(){
int i;
void (*pf)();
pf=open;
(*pf)();//////調用open()
for(i=0;i<3;i++)////依次調用open()、print()、exit()函數
(*pfs[i])();
}
void open(){
printf("open\n");
}
void print(){
printf("print\n");
}
void exit(){
printf("exit\n");
}
從這個例子可以看出,函數名本身就是函數代碼區的地址。
還有幾個容易混淆的定義,考慮下面幾個定義:
void (*getInterrupt(int no))();
void setInterrupt(int no,void (*pf));
LRESULT (*lpfnWndProc)(HWND,UNIT,WPARM,LPARAM);
第一個聲明表示getInterrupt的原型聲明,它有一個int類型的參數,返回值是指向類似void
f()函數的指針。其實getInterrupt(int no)運行後就是這個函數的返回值.
第二個聲明表示函數setInterrupt的原型聲明,返回值是void,它有兩個參數,類型分別是int和指向void f()函數的指針。
第三個聲明定義了一個指針變量lpfnWndProc,指向形如LRESULT wndproc(HWND,UNIT,WPARM,LPARAM)的函數。