在學習arm過程中發(fā)現(xiàn)這“指針函數(shù)”與“函數(shù)指針”容易搞錯,,最簡單的辨別方式就是看函數(shù)名前面的指針*號有沒有被括號()包含,如果被包含就是函數(shù)指針,,反之則是指針函數(shù)。 今天我們從頭把它搞清楚
首先它們之間的定義:
1、指針函數(shù)是指帶指針的函數(shù),,即本質(zhì)是一個函數(shù),,函數(shù)返回類型是某一類型的指針。 類型標識符 *函數(shù)名(參數(shù)表) int *f(x,,y);
首先它是一個函數(shù),,只不過這個函數(shù)的返回值是一個地址值。函數(shù)返回值必須用同類型的指針變量來接受,,也就是說,,指針函數(shù)一定有函數(shù)返回值,而且,,在主調(diào)函數(shù)中,,函數(shù)返回值必須賦給同類型的指針變量。 表示: float *fun(); float *p; p = fun(a);
來講詳細一些吧,!請看下面 注意指針函數(shù)與函數(shù)指針表示方法的不同,,千萬不要混淆。
指針函數(shù): 例如: int *GetDate(); int * aaa(int,int);
函數(shù)返回的是一個地址值,,經(jīng)常使用在返回數(shù)組的某一元素地址上,。 1 int * GetDate(int wk,int dy); 2 main() 3 { 4 int wk,dy; 5 do{ 6 printf(Enter week(1-5)day(1-7)\n); 7 scanf(%d%d,&wk,&dy); 8 } 9 while(wk<1||wk>5||dy<1||dy>7); 10 printf(%d\n,*GetDate(wk,dy)); 11 } 12 13 int * GetDate(int wk,int dy) 14 { 15 static int calendar[5][7]= 16 { 17 {1,2,3,4,5,6,7}, 18 {8,9,10,11,12,13,14}, 19 {15,16,17,18,19,20,21}, 20 {22,23,24,25,26,27,28}, 21 {29,30,31,-1} 22 }; 23 return &calendar[wk-1][dy-1]; 24 } 程序應(yīng)該是很好理解的,,子函數(shù)返回的是數(shù)組某元素的地址,。輸出的是這個地址里的值,。
2,、函數(shù)指針是指向函數(shù)的指針變量,,即本質(zhì)是一個指針變量,。 int (*f) (int x); /*聲明一個函數(shù)指針 */ f=func; /* 將func函數(shù)的首地址賦給指針f */ 指向函數(shù)的指針包含了函數(shù)的地址的入口地址,,可以通過它來調(diào)用函數(shù),。聲明格式如下: void (*fptr)();
把函數(shù)的地址賦值給函數(shù)指針,,可以采用下面兩種形式: fptr=&Function; fptr=Function; 取地址運算符&不是必需的,因為單單一個函數(shù)標識符就標號表示了它的地址,,如果是函數(shù)調(diào)用,還必須包含一個圓括號括起來的參數(shù)表,。 x=(*fptr)(); x=fptr(); 第二種格式看上去和函數(shù)調(diào)用無異。但是有些程序員傾向于使用第一種格式,,因為它明確指出是通過指針而非函數(shù)名來調(diào)用函數(shù)的,。 下面舉一個例子: 1 void (*funcp)(); 2 void FileFunc(),EditFunc(); 3 4 main() 5 { 6 funcp=FileFunc; 7 (*funcp)(); 8 funcp=EditFunc; 9 (*funcp)(); 10 } 11 12 void FileFunc() 13 { 14 printf(FileFunc\n); 15 } 16 17 void EditFunc() 18 { 19 printf(EditFunc\n); 20 }
程序輸出為: FileFunc EditFunc
主要的區(qū)別是一個是指針變量,,一個是函數(shù)。在使用是必要要搞清楚才能正確使用
轉(zhuǎn)自:http://www.cnblogs.com/gmh915/archive/2010/06/11/1756067.html 有整理與刪改
|
|