1. 程式人生 > >指標系統學習6-指向函式的指標

指標系統學習6-指向函式的指標

1.用函式指標變數呼叫函式

可以用指標變數指向整型變數、字串、陣列,也可以指向一個函式。一個函式在編譯時被分配給一個入口地址。這個函式的入口地址就稱為函式的指標。

//指向函式的指標


/****************************/
/* 比較a 和 b的大小,求大值 */
/****************************/

#include <stdio.h>

#if(0)//預編譯命令:if語句為0,則不用編譯,為1則編譯!   
    // c語言不允許巢狀註釋,所以用此方法可以註釋比較多內容
void main()
{
      int max(int, int
); int a, b, c; scanf("%d %d", &a, &b); c = max(a, b); printf("a = %d, b = %d, max = %d\n\n", a, b, c); } #endif int max(int x, int y) { int z; if( x > y ) { z = x; } else { z = y; }
return z; } #if(1) //將 main 函式改寫為 #include <stdio.h> void main() { int max(int, int); int (*p)();//定義了一個函式指標(指向函式的指標) int a, b, c; p = max; scanf("%d %d", &a, &b); c = (*p)(a, b); printf("a = %d, b = %d, max = %d\n\n", a, b, c); }
#endif

 

2.用指向函式的指標作函式引數:

函式指標變數常用的用途之一是把指標作為引數傳遞到其他函式。

前面介紹過,函式的引數可以是變數、指向變數的指標變數、陣列名、指向陣列的指標變數等。

現在介紹指向函式的指標也可以作為引數,以實現函式地址的傳遞,這樣就能夠在被呼叫的函式中使用實參函式。

// 實參函式名     f1             f2
                ↓                  ↓
void  sub( int (*x1)(int),int (*x2)(int,int))
{  int a,b,i,j;
     a=(*x1)(i);       /*呼叫f1函式*/
     b=(*x2)(i,j);/*呼叫f2函式*/
      …
 }

它的原理可以簡述如下:有一個函式(假設函式名為sub),它有兩個形參(x1和x2),定義x1和x2為指向函式的指標變數。在呼叫函式sub時,實參為兩個函式名f1和f2,給形參傳遞的是函式f1和f2的地址。這樣在函式sub中就可以呼叫f1和f2函數了。

實戰演練:

  設一個函式process,在呼叫它的時候,每次實現不同的功能。(有點類似多型)

    輸入a和b兩個數,第一次呼叫process時找出a和b中大者,第二次找出其中小者,第三次求a與b之和。

/***********************************************************/
/*  設一個函式process,在呼叫它的時候,每次實現不同的功能。*/
/*  輸入a和b兩個數,第一次呼叫process時找出a和b中大者,*/
/*  第二次找出其中小者,第三次求a與b之和。               */
/***********************************************************/

#include <stdio.h>

void main()
{
      int max(int, int);            /* 函式宣告 */
      int min(int, int);            /* 函式宣告 */
      int add(int, int);            /* 函式宣告 */
    
      void process( int, int, int(*fun)() );    /* 函式宣告 */
      
      int a, b;

      printf("Endter a and b: ");
      scanf("%d %d", &a, &b);
      
      printf("max = ");
      process(a, b, max);

      printf("min = ");
      process(a, b, min);

      printf("sum = ");
      process(a, b, add);
}

int max(int x, int y)              /* 函式定義 */
{
      int z;
      
      if( x > y )
      {
            z = x;
      }
      else
      {
            z = y;
      }

      return z;
}

int min(int x, int y)              /* 函式定義 */
{
      int z;

      if( x < y )
      {
            z = x;
      }
      else
      {
            z = y;
      }

      return z;
}

int add(int x, int y)
{
      int z;
      
      z = x + y;
      return z;
}

void process( int x, int y, int(*fun)() )    /* 函式定義 */ 
{
      int result;

      result = (*fun)(x, y);
      printf("%d\n", result);
}
View Code