1. 程式人生 > >c語言_指標型函式

c語言_指標型函式

 函式指標變數 

    在C語言中,一個函式總是佔用一段連續的記憶體區,而函式名就是該函式所佔記憶體區的 首地址。我們可以把函式的這個首地址(或稱入口地址)賦予一個指標變數,使該指標變數指 向該函式。然後通過指標變數就可以找到並呼叫這個函式。我們把這種指向函式的指標變數 稱為“函式指標變數”。 函式指標變數定義的一般形式為: 型別說明符 (*指標變數名)(); 其中“型別說明符”表示被指函式的返回值的型別。“(* 指標變數名)”表示“*”後面的變數 是定義的指標變數。後的空括號表示指標變數所指的是一個函式。

例如: int (*pf)(); 表示 pf 是一個指向函式入口的指標變數,該函式的返回值(函式值)是整型。 本例用來說明用指標形式實現對函式呼叫的方法。

int max(int a,int b)
{ 
    if(a>b)return a; 
    else return b;
 } 
  main()
           { 
               int max(int a,int b); 
               int(*pmax)(); 
               int x,y,z; 
               pmax=max;
               printf("input two numbers:\n"); 
               scanf("%d%d",&x,&y); 
               z=(*pmax)(x,y);
               printf("maxmum=%d",z); 
      } 

     從上述程式可以看出用,函式指標變數形式呼叫函式的步驟如下: 1) 先定義函式指標變數,如後一程式中第 9 行 int (*pmax)();定義 pmax 為函式指標變 量。 2) 把被調函式的入口地址(函式名)賦予該函式指標變數,如程式中第 11 行 pmax=max; 3) 用函式指標變數形式呼叫函式,如程式第 14 行 z=(*pmax)(x,y); 4) 呼叫函式的一般形式為: (*指標變數名) (實參表) 使用函式指標變數還應注意以下兩點: a) 函式指標變數不能進行算術運算,這是與陣列指標變數不同的。陣列指標變數加減一個 整數可使指標移動指向後面或前面的陣列元素,而函式指標的移動是毫無意義的。 b) 函式呼叫中"(*指標變數名)"的兩邊的括號不可少,其中的*不應該理解為求值運算,在 此處它只是一種表示符號。 

指標型函式 

    所謂函式型別是指函式返回值的型別。在C語言中允許一個函式的返 回值是一個指標(即地址),這種返回指標值的函式稱為指標型函式。

定義指標型函式的一般形式為: 型別說明符 *函式名(形參表) { …… /*函式體*/ }

其中函式名之前加了“*”號表明這是一個指標型函式,即返回值是一個指標。型別說明符 表示了返回的指標值所指向的資料型別。 如: int *ap(int x,int y) { ...... /*函式體*/ } 表示 ap 是一個返回指標值的指標型函式,它返回的指標指向一個整型變數。 本程式是通過指標函式,輸入一個 1~7 之間的整數,輸出對應的星期名。

 main()
 { 
     int i; char *day_name(int n);
      printf("input Day No:\n");  
     scanf("%d",&i); if(i<0) exit(1);
     printf("Day No:%2d-->%s\n",i,day_name(i)); 
 } 
char *day_name(int n)
{
          static char *name[]={ "Illegalday", 
                                 "Monday", 
                                 "Tuesday", 
                                 "Wednesday",
                                 "Thursday", 
                                 "Friday",
                                 "Saturday", 
                                  "Sunday"
                               }; 
 return((n<1||n>7) ? name[0] : name[n]);
} 

本例中定義了一個指標型函式 day_name,它的返回值指向一個字串。該函式中定義 了一個靜態指標陣列 name。name 陣列初始化賦值為八個字串,分別表示各個星期名及出 錯提示。形參 n 表示與星期名所對應的整數。在主函式中,把輸入的整數 i 作為實參,在 printf 語句中呼叫 day_name 函式並把 i 值傳送給形參 n。day_name 函式中的 return 語句 包含一個條件表示式,n 值若大於 7 或小於 1 則把 name[0]指標返回主函式輸出出錯提示字 符串“Illegal day”。否則返回主函式輸出對應的星期名。主函式中的第 7 行是個條件語句, 其語義是,如輸入為負數(i<0)則中止程式執行退出程式。exit 是一個庫函式,exit(1)表 示發生錯誤後退出程式,exit(0)表示正常退出。 應該特別注意的是函式指標變數和指標型函式這兩者在寫法和意義上的區別。如 int(*p)()和 int *p()是兩個完全不同的量。 int (*p)()是一個變數說明,說明 p 是一個指向函式入口的指標變數,該函式的返回 值是整型量,(*p)的兩邊的括號不能少。 int *p()則不是變數說明而是函式說明,說明 p 是一個指標型函式,其返回值是一個 指向整型量的指標,*p 兩邊沒有括號。作為函式說明,在括號內好寫入形式引數,這樣 便於與變數說明區別。 對於指標型函式定義,int *p()只是函式頭部分,一般還應該有函式體部分。