C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 > 指針 閱讀:5,478

C語言指向函數的指針

C 語言的函數指針有很多用法。例如,當調用一個函數時,可能不僅想傳入該函數需要被處理的數據,還希望傳入指向子程序的指針,該子程序決定如何處理數據。

可以在數組中存儲函數指針,然后使用數組的索引來調用這些函數。例如,鍵盤驅動程序可能使用函數指針數組,數組索引對應到了鍵盤編碼。當用戶按下一個鍵時,程序就會跳到對應的函數。

與數組指針的聲明一樣,函數指針的聲明也需要括號。下面的例子展示了如何聲明函數指針。這個聲明定義了一個指向函數的指針,該函數具有兩個 double 類型的參數和 double 類型的返回值:
double (*funcPtr)(double, double);

該聲明中采用括號將星號和標識符包圍起來,這個括號很重要。如果沒有它,聲明 double*funcPtr(double,double);則為函數原型,而不是指針定義。

無論是否必須,函數名會被隱式地轉換成函數指針。因此,下面的語句會將標準函數 pow()的地址賦值給指針 funcPtr,然后利用該指針調用這個函數:
double result;
funcPtr = pow;               // 使得funcPtr指向函數pow()
                                             // 因此,表達式*funcPtr獲得函數pow()
result = (*funcPtr)( 1.5, 2.0 ); // 通過funcPtr調用函數
result = funcPtr( 1.5, 2.0 );    // 與上等效的函數調用

如本例中最后一行所示,當使用指針調用函數時,可以不用間接運算符,因為函數調用運算符的左操作數具有函數指針類型。

例 1 所示程序提示用戶輸入兩個數字,然后對它們進行簡單的計算。該數學函數通過存儲在數組 funcTable 中的指針調用獲得。

【例1】函數指針的簡單用法
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double Add( double x, double y ) { return x + y; }
double Sub( double x, double y ) { return x - y; }
double Mul( double x, double y ) { return x * y; }
double Div( double x, double y ) { return x / y; }

// 具有5個函數指針的數組,這些函數需要兩個double類型參數,返回值為double類型
double (*funcTable[5])(double, double)
          = { Add, Sub, Mul, Div, pow };        // 初始化器列表

// 一個字符串指針數組,用于輸出:
char *msgTable[5] = {"Sum", "Difference", "Product", "Quotient", "Power"};

int main()
{
  int i;                                                // 索引變量
  double x = 0, y = 0;

  printf( "Enter two operands for some arithmetic:\n" );
  if ( scanf( "%lf %lf", &x, &y ) != 2 )
    printf( "Invalid input.\n" );

  for ( i = 0; i < 5; ++i )
    printf( "%10s: %6.2f\n", msgTable[i], funcTable[i](x, y) );

  return 0;
}

表達式 funcTable[i](x,y)會調用地址保存在指針 funcTable[i] 中的函數。數組名稱和下標不需要被包含在括號內,因為函數調用運算符()和下標運算符 [] 都具有最高的優先級,以及從左至右的結合律。

再次提醒,采用 typedef 定義簡單的類型名稱,對于諸如函數指針數組這樣的復雜類型,將更容易管理。例如,可以采用如下形式定義數組 funcTable:
typedef double func_t( double, double );      // 函數類型名稱定義為func_t
func_t *funcTable[5] = { Add, Sub, Mul, Div, pow };

上述定義方法顯然比例 1 中的數組定義可讀性更高。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo