close

什麼是函式指標?

在 C 程式中資料存放在記憶體中,因此任何一筆資料都有它的起始記憶體位址,不論是字串常數、自動配置的變數 / 陣列、或是動態配置的變數都一樣,例如:

  char *addr1 = "Constant String";
int *addr2 = &x; /* int x; */
double *addr3 = y; /* double y[100]; */
char *addr4 = (char *) malloc(sizeof(char)*200);

上述四 個變數都是用來存放記憶體位址的變數,你可以用

  printf("%p", addr);

來看到變數裡放的的實際位址數值。

在 von Neuman 架構中,可以執行的程式碼 (例如函式),當然也需要放在記憶體中才能夠執行,因此函式也會有記憶體位址,它的基本上是函式載入記憶體後的起始位址,例如:

  #include <cstdio>

double square(double x)
{
return x * x;
}

void main()
{
printf("address of square = %p(%p)\n", square, &square);
printf("address of main = %p(%p)\n", main, &main);
}

在上面這個程式中,不論是 square 或是 &square 都沒有呼叫 square 函式, 這樣的寫法只是代表 square 函式的起始位址的常數而已,如果要執行函式呼叫的話,必須寫成:

	square(x);
所謂的函式指標變數就是可以存放函式起始位址的變數,例如,我們定義一個可以存放上述 square 函式位址的指標變數 fp,其使用方法如下:
  double (*fp)(double);
...
fp = square; // 設定變數內容
...
(*fp)(x); // 呼叫 square() 函式

函式指標變數的宣告必須包含函式的回傳值型態、參數個數、與參數的型態,如此在透過這個指標變數進行函式呼叫時,編譯器才知道如何處理其參數及回傳值。

函式指標變數 fp 的宣告看起來有點不像是個變數,你可以用 typedef 敘述來簡化上面的宣告

typedef double (*FuncPtr_t)(double);
FuncPtr_t fp; // 比較像是一個變數了吧
...
fp = square;
...
(*fp)(x);

函式指標變數的宣告可以非常複雜,以後有機會再詳細解釋。


arrow
arrow
    全站熱搜

    天才R 發表在 痞客邦 留言(0) 人氣()