回覆列表
  • 1 # 影片好笑

     (一) 用函式指標變數呼叫函式  可以用指標變數指向整形變數、字串、陣列、結構體、也可以指向一個函式。一個函式在編譯時被分配一個入口地址。這個入口地址就稱為函式指標。可以用一個指標變數指向函式,然後透過該指標變數呼叫此函式。用簡單的數值比較為例:1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int max(int,int); 7 int (*p)(int,int); 8 int a,b,c; 9 p = max;10 scanf("%d,%d",&a,&b);11 c = (*p)(a,b);12 printf("a=%d,b=%d,max=%d\n",a,b,c);13 return 0;14 }15 16 int max(int x,int y)17 {18 int z;19 if(x>y) z = x;20 else z = y;21 return(z);22 }  main函式中的" c = max(a,b); " 包括了一次函式的呼叫。每一個函式都佔用一段記憶體單元。因此,可以用一個指標變數指向一個函式,透過指標變數來訪問它指向的函式。  第7行:int (*p)( int,int ); 用來定義 p 是一個指向函式的指標變數,該函式有兩個整形引數,函式值為整形。注意 *p 兩側的括號不可省略,表示 p 先與 * 結合,是指標變數,然後再與後面的 ( ) 結合,表示此指標變數指向函式,這個函式值 (即函式的返回值) 是整形的。如果寫成 int *p ( int,int ) ,由於( )的優先順序高於 *,它就成了宣告一個函式P( 這個函式的返回值是指向整形變數的指標)。  賦值語句 p = max ; 作用是將函式 max 的入口地址賦給指標變數p。和陣列名代表陣列首元素地址類似,函式名代表該函式的入口地址。這時 p 就是指向函式 max 的指標變數,此時 p 和 max都指向函式開頭,呼叫 *p 就是呼叫 max 函式。但是p作為指向函式的指標變數,它只能指向函式入口處而不可能指向函式中間的某一處指令處,因此不能用 *(p + 1)來表示指向下一條指令。  注意:  (1) 指向函式的指標變數的一般定義形式為:  資料型別 (*指標變數名)(函式引數列表)  這裡資料型別就是函式返回值的型別  (2) int (* p) ( int,int ); 它只是定義一個指向函式的指標變數 p, 它不是固定指向哪一個函式的,而只是表示定義這樣一個型別的變數,它是專門用來存放函式的入口地址的。在程式中把哪一函式(該函式的值應該是整形的,且有兩個整形引數)的地址賦給它,他就指向哪一個函式。在一個函式中,一個函式指標變數可以先後指向同類型的不同函式。  (3) p = max; 在給函式指標變數賦值時,只需給出函式名而不必給出函式引數,因為是將函式的入口地址賦給 p ,而不涉及 實參和形參的結合問題,不能寫成 p = max(a,b);  (4) c = (*p)(a,b) 在函式呼叫時,只需將( *p ) 代替函式名即可,後面實參依舊。  (5) 對於指向函式的指標變數,像 p++ ,p+n.....是無意義的。  (二) 用指向函式的指標作為函式引數  函式指標變數通常的用途之一就是把指標作為引數傳遞到其他函式。  函式的引數可以是變數、指向變數的指標變數、陣列名、指向陣列的指標變數,也可以是指向函式的指標也可以作為引數,以實現函式地址的傳遞,這樣就能夠在被呼叫的函式中使用實參函式。  void sub ( int ( *x1) (int), int (*x2) (int,int) )    {      int a,b,i,j;      a = (*x1)(i);      /* 呼叫 f1 函式 */      b = (*x2)(i)(j);    /* 呼叫 f2 函式 */    }  如果實參為兩個 函式名 f1 和 f2. 在函式首部定義x1、x2為函式指標變數,x1指向的函式有一個整形形參,x2指向的函式有兩個形參。i 和 j 是函式f1 和 f2所要的引數。函式sub的形參 x1、x2(指標變數)在函式 sub 未被呼叫時並不佔用記憶體單元,也不指向任何函式。在sub被呼叫時,把實參函式 f1 和 f2的入口地址傳給形式指標變數 x1 和 x2.  既然在 sub 函式中要呼叫 f1 和 f2 函式,為什麼不直接呼叫f1 和 f2而要用函式指標變數呢? 確實,如果只是用到f1 和 f2 函式,完全可以在sub函式中直接呼叫f1 和 f2,而不必設指標變數 x1 和 x2。 但是,如果在每次呼叫sub時,呼叫的函式不是固定的,下次是f3 和 f4,再是f5 和 f6...這時用指標變數就比較方便了。

  • 2 # 使用者1220686403821

    具體例子

    int main()

    {void (*p)(int n);//宣告函式指標的時候,引數的個數和型別必須和被指向的函式相同

    void fun(int a);

    p=fun;//指標p指向fun,fun是地址,正確

    (*p)(0);//透過指標呼叫函式,與p();等價其中0是作為函式的引數

    return 0;}

    void fun(int a)

    {}

    因為函式的呼叫是需要一定的開銷的,當一個函式經常被呼叫的時候,如果函式只有幾行,這樣我們可以透過inline函式來解決函式呼叫開銷的問題。

    但是如果函式有很多行且經常呼叫,那麼,我們可以透過函式指標來解決函式呼叫開銷的問題

  • 中秋節和大豐收的關聯?
  • 電腦上網時能進入二級頁面但是不彈出視窗這是怎麼回事?