1. 程式人生 > >函式指標的作用以及好處

函式指標的作用以及好處

<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];

程式可以通過掃描這個事件佇列來獲取每個事件對應的處理函式,然後呼叫它,即為回撥函式。