猛一看還真有點糊糊;注意區別:
1、函數型指標:指函數傳回值的類型。
指標型函數:傳回值是一個指標(即地址)
2、int(*p)()和int *p() 是一樣嗎?為什嗎?
int (*p)()是一個變數說明,說明 p 是一個指向函數入口的指標變數,該函數的傳回值是整型量,(*p)的兩邊的括弧不能少。 -->函數型指標
int *p()則不是變數說明而是函數說明,說明 p 是一個指標型函數,其傳回值是一個指向整型量的指標,*p 兩邊沒有括弧。作為函數說明,在括弧內最好寫入形式參數.-->指標型函數
一、函數型指標
在C語言中,一個函數總是佔用一段連續的記憶體區,而函數名就是該函數所佔記憶體區的首地址。我們可以把函數的這個首地址(或稱入口地址)賦予一個指標變數,使該指標變數指向該函數。然後通過指標變數就可以找到並調用這個函數。我們把這種指向函數的指標變數稱為“函數指標變數”。
函數指標變數定義的一般形式為:
類型說明符 (*指標變數名)();
其中“類型說明符”表示被指函數的傳回值的類型。 “(* 指標變數名)”表示“*”後面的變數是定義的指標變數。最後的空括弧表示指標變數所指的是一個函數。
例如:int (*p)();
p表示是一個指向函數入口的指標變數,該函數的傳回值(函數值)是整型。
Eg:
main(){ int SelectMax(int a,int b);//函式宣告 int (*pmax)();//函數指標變數定義的一般形式為:類型說明符 (*指標變數名)(); int x,y,z; pmax = SelectMax;//指標賦值,方法不要括弧 printf("輸入兩位元字:\n"); scanf("%d%d",&x,&y);// 給a.b賦值 z = (*pmax)(x,y);//調用方法 printf("最大值:%d \n最小值:%d\n",x,y);}int SelectMax(int a,int b){ if(a>b) return a; else return b; }
結果:
解釋:
1、先定義函數指標變數,如後一程式中第 9 行 int (*pmax)();定義 pmax 為函數指標變數。
2、把被調函數的入口地址(函數名)賦予該函數指標變數,如程式中第 11 行 pmax=SelectMax;
3、用函數指標變數形式調用函數,如程式第 14 行 z=(*pmax)(x,y);
調用函數的一般形式為:
(*指標變數名) (實參表)
4、使用函數指標變數還應注意以下兩點:
1、函數指標變數不能進行算術運算,這是與數組指標變數不同的。數組指標變數加減一個整數可使指標移動指向後面或前面的數組元素,而函數指標的移動是毫無意義的
2、函數調用中"(*指標變數名)"的兩邊的括弧不可少,其中的*不應該理解為求值運算,在此處它只是一種表示符號
二、指標型函數
函數類型是指函數傳回值是一個值的類型。在C語言中允許一個函數的傳回值是一個指標(即地址),這種返回指標值的函數稱為指標型函數。
定義指標型函數的一般形式為:
類型說明符 *函數名(形參表)
{
…… /*函數體*/
}
其中函數名之前加了“*”號表明這是一個指標型函數,即傳回值是一個指標。類型說明符表示了返回的指標值所指向的資料類型。
如:
int *ap(int x,int y)
{
...... /*函數體*/
}
表示 ap 是一個返回指標值的指標型函數,它返回的指標指向一個整型變數。
Eg:
main(){ int i; char *day_name(int n); printf("輸入天數:\n"); scanf("%d",&i); if(i<0) exit(1); printf("今天是:%2d-->%s\n",i,day_name(i));}har *day_name(int i){ static char *name[8]={ "非法的數字","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday" }; return (i<1||i>7?name[0]:name[i]);}
結果:
函數指標和指標函數注意區別:
函數指標 int (*p) ()
指標函數 int *p() 一般還有函數體 int *p(){……}
作者:PEPE
出處:http://pepe.cnblogs.com/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。