函數指針和指針函數區別以及如何應用,舉例說明

一直忘記這兩者的區別,每次用到是重新撿起;  這裏解析的比較簡約,所以收藏!!

引用源:http://zhidao.baidu.com/question/264795890.html

1 函數指針變量
在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) 函數調用中"(*指針變量名)"的兩邊的括號不可少,其中的*不應該理解爲求值運算,在此處它只是一種表示符號。

2 指針型函數
前面我們介紹過,所謂函數類型是指函數返回值的類型。在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[]={ "Illegal day",
"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()只是函數頭部分,一般還應該有函數體部分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章