関数ポインタとポインタ関数、および関数ポインタ配列


  :    a,  a         

       switch case
         ,           ,          ...              ,   。

     ,             ?

------------------------------------------------------------------------------------

           


             ,   :        ;      。

   ,    :

{ 
  :                    。      ,           ,                  。 
    :         :   [] 
  ,             :*   []. 
  ,                       :        (*   [])().   ,       “*   []”       ?                   ,                    ,              ,   *   []()        ?                。         ?   。       ,              。

}

   ,   :

        ,             ,           。       :               。
                   。               ,                ,       。 
                       ,            。


    :
#include "stdio.h"
int add1(int a1,int b1);

int add2(int a2,int b2);

int main(int argc,char* argv[])

{

int numa1=1,numb1=2;

int numa2=2,numb2=3;

int (*op[2])(int a,int b);

op[0]=add1;

op[1]=add2;

printf("%d %d
",op[0](numa1,numb1),op[1](numa2,numb2)); getch(); } int add1(int a1,int b1) { return a1+b1; } int add2(int a2,int b2) { return a2+b2; } C : a) (An integer) b) (A pointer to an integer) c) , (A pointer to a pointer to an integer) d) 10 (An array of 10 integers) e) 10 , (An array of 10 pointers to integers) f) 10 (A pointer to an array of 10 integers) g) , (A pointer to a function that takes an integer as an argument and returns an integer) h) 10 , , ( An array of ten pointers to functions that take an integer argument and return an integer ) : a) int a; // An integer b) int *a; // A pointer to an integer c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers e) int *a[10]; // An array of 10 pointers to integers f) int (*a)[10]; // A pointer to an array of 10 integers g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer , , char* buffer int length,buffer ,length 。 : , , (buffer[0]) , 256(28 ) 。 , , 。 , : void MyFuntion( char* buffer, int length ) {     __int8 nStreamType = buffer[0];     switch( nStreamType )     {        case 0:            function1();            break;        case 1:        ......        case 255:            function255();            break;      } } , , , , , , 。 , 。    , C , , 。 , , int*、double* , : int funtion( int x, int y ); void main ( void ) {    int (*fun) ( int x, int y );    int a = 10, b = 20;    function( a, b );    fun = function;    (*fun)( a, b );     …… }    1 function, , ( ); 3 , int* double* , , , *fun ; 6 funtion, *fun function 。 5 function(), 7 , 。    , 。 , , , 。 , 、 。 , : 256 ( )。 void funtion0( void ); …… void funtion255(void ); , 。 void (*fun[256])(void); fun[0] = function0; …… fun[255] = function(); ,MyFunction() : void MyFuntion( char* buffer, int length ) {     __int8 nStreamType = buffer[0];     (*fun[nStreamType])(); }    2 , 256 case , , nStreamType , , , case 。 , 。 typedef C++ ( typedef ) ( ) 。 // 1: (* )( ) char (*pFun)(int); char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(2); } pFun。 “ 1” , int , char 。 , 。 glFun()。 int char 。 —— , 。 main() , —— glFun pFun。main() “*pFun” pFun , glFun() , 2。 ( ) typedef 。 // 2:typedef (* )( ) typedef char (*PTRFUN)(int); PTRFUN pFun; char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(2); } typedef 。 PTRFUN , , int char 。 int,char PTRFUN 。 pFun, 1 。 ( ) C++ 。 // 3:typedef ( ::* )( ) class CA { public: char lcFun(int a){ return; } }; CA ca; typedef char (CA::*PTRFUN)(int); PTRFUN pFun; void main() { pFun = CA::lcFun; ca.(*pFun)(2); } , “ ” “ ”, , new 。 : CA *pca = new CA; pca->(*pFun)(2); delete pca; , this 。 : CA PTRFUN m_pfun; void CA::lcFun2() { (this->*m_pFun)(2); } , “->*” “.*” 。 , typedef ( ), (test.dll) : int DoCase(int, long); , : 1. : int (*DOCASE)(int ,long);// DoCase HINSTANCE gLibMyDLL = NULL; gLibMyDLL = LoadLibrary("test.dll"); if(gLibMyDLL != NULL) { // DOCASE = (int(*)(int,long))GetProcAddress(gLibMyDLL, "DoCase"); } // int s = DOCASE(1,1000); 2. typedef :typedef (*DOCASE)(int ,long); HINSTANCE gLibMyDLL = NULL; DOCASE _docase; gLibMyDLL = LoadLibrary("test.dll"); if(gLibMyDLL != NULL) { _docase = (DOCASE)GetProcAddress(gLibMyDll, "DoCase"); } // int s=_docase(1,1000);