函式指標的作用以及好處
阿新 • • 發佈:2019-01-02
<span style="font-family:SimSun;">//函式指標使用的例子</span>
<span style="font-family:SimSun;">#include <stdio.h> #include <string.h> char * fun(char * p1,char * p2) { int i = 0; i = strcmp(p1,p2); if (0 == i) { return p1; } else { return p2; } } int main() { char * (*pf)(char * p1,char * p2); pf = &fun; (*pf) ("aa","bb"); return 0; }</span>
我們使用指標的時候,需要通過鑰匙(“*”)來取其指向的記憶體裡面的值,函式指標使用也如此。通過用(*pf)取出存在這個地址上的函式,然後呼叫它。
這裡需要注意到是,在VS2015裡,給函式指標賦值時,可以用&fun或直接用函式名fun。這是因為函式名被編譯之後其實就是一個地址,所以這裡兩種用法沒有本質的差別。
看下另外的例子:
首先來看這行程式碼:<span style="font-family:SimSun;">void Function() { printf("Call Function!\n"); } int main() { <span style="line-height: 25.2px;">void (*p)();</span> *(int*)&p=(int)Function; (*p)(); return 0; } </span>
void (*p)();
這行程式碼定義了一個指標變數p,p指向一個函式,這個函式的引數和返回值都是void。
&p是求指標變數p本身的地址,這是一個32位的二進位制常數(32位系統)。
(int*)&p表示將地址強制轉換成指向int型別資料的指標。
(int)Function表示將函式的入口地址強制轉換成int型別的資料。
分析到這裡,相信你已經明白*(int*)&p=(int)Function;表示將函式的入口地址賦值給指標變數p。
那麼(*p) ();就是表示對函式的呼叫。
其實函式指標與普通指標沒什麼差別,只是指向的內容不同而已。主要作用:
1. 實現面向物件程式設計中的多型性
2. 回撥函式
比如:
int fun1(char *str );
int fun2(char *str);
有一個結構體維護:
typedef int (*fun)(char *str);
struct
{
fun f;
}Fun;
最後有一個呼叫函式:
int call(char * str)
{
return Fun.f(str);
}
2. Windows程式設計中的事件handle函式,即回撥函式,在事件佇列都是一個函式指標來儲存的:
typedef void (*event_handler) (unsigned int para1, unsigned int para2);
struct event {
unsigned int ev_id;
event_handler handler;
};
struct event event_queue[MAX_EVENT_SIZE];
程式可以通過掃描這個事件佇列來獲取每個事件對應的處理函式,然後呼叫它,即為回撥函式。