天天看點

C語言中的函數指針

1. 函數指針的定義

顧名思義,函數指針就是函數的指針。它是一個指針,指向一個函數。

2.函數指針的使用

我們定義了一個函數指針,但如何來使用它呢?先看如下例:

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

3.函數指針數組

現在我們清楚表達式 “char * (*pf)( char * p) ”定義的是一個函數指針pf 。既然pf 

是個指針,那就可以儲存在個數組。把上式修改下:

char * (*pf[3])(char * p);

這是定義一個函數指針數組。它是一個數組,數組名為pf ,數組記憶體儲了3 個

指向函數的

指針。這些指針指向些傳回值類型為指向字元的指針、參數為億個指向字元

的指針的函數

數。這念起來似乎有點拗口。不過不要緊,關鍵是你明這是一個指針數組,

是數組。

函數指針數組怎麼使用呢?也給出一個非常簡單的例字,隻要真正掌握了

使用方法,

再複雜的問題都可以應對。如下:

char * fun1(char * p)

          printf( "%s\n", p);

           return p;

char * fun2(char * p)

char * fun3(char * p)

           char * (*pf[3])(char * p);

          pf[0] = fun1; // 可以直接指派函數名

          pf[1] = &fun2; // 可以給函數名加上取位址符

          pf[2] = &fun3;

          pf[0]( "fun1");

          pf[0]( "fun2");

          pf[0]( "fun3");

4.函數指針的數組的應用(簡單電腦的實作):

int add(int a, int b)

           return a + b;

int sub(int a, int b)

           return a - b;

int mul(int a, int b)

           return a*b;

int div(int a, int b)

           return a / b;

           int x, y;

           int input = 1;

           int ret = 0;

           while (input)

                   printf( "*************************\n" );

                   printf( "  1:add           2:sub  \n" );

                   printf( "  3:mul           4:div  \n" );

                   printf( "請選擇:" );

                   scanf( "%d", &input);

                    switch (input)

                   {

                    case 1:

                             printf( "輸入操作數:" );

                             scanf( "%d %d", &x, &y);

                             ret = add(x, y);

                              break;

                    case 2:

                             ret = sub(x, y);

                    case 3:

                             ret = mul(x, y);

                    case 4:

                             ret = div(x, y);

                   default:

                             printf( "選擇錯誤\n" );

                   }

                   printf( "ret = %d\n", ret);

使用函數指針數組的實作:

           int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //轉移表

                    if ((input < 4 && input > 1))

                             printf( "輸操作數:" );

                             ret = (*p[input])(x, y);

                    else

                             printf( "輸入有誤\n" );

繼續閱讀