指針函數與函數指針

1.指針函數

先看下面的函數聲明,注意,此函數有返回值,返回值爲int *,即返回值是指針類型的。

[cpp] view plain copy
  1. int *f(int a, int b);  
上面的函數聲明又可以寫成如下形式:

int* f(int a, int b);
讓指針標誌 * 與int緊貼在一起,而與函數名f間隔開,這樣看起來就明瞭些了,f是函數名,返回值類型是一個int類型的指針。

下面看指針函數的實現:

[cpp] view plain copy
  1. int *f(int a, int b); // 聲明指針函數  
  2.   
  3. int _tmain(int argc, _TCHAR* argv[])  
  4. {  
  5.     printf("------------------------------ Start\n");  
  6.   
  7.     int *p1 = NULL;  
  8.     printf("The memeory address of p1 = 0x%x \n", p1);  
  9.   
  10.     p1 = f(1, 2);  
  11.   
  12.     printf("The memeory address of p1 = 0x%x \n", p1);  
  13.     printf("*p1 = %d \n", *p1);  
  14.   
  15.     printf("------------------------------ End\n");  
  16.     getchar();  
  17.     return 0;  
  18. }  
  19.   
  20. /* 
  21.  * 指針函數的定義 
  22.  * 返回值是指針類型int * 
  23.  */  
  24. int *f(int a, int b) {  
  25.     int *p = (int *)malloc(sizeof(int));  
  26.     printf("The memeory address of p = 0x%x \n", p);  
  27.     memset(p, 0, sizeof(int));  
  28.     *p = a + b;  
  29.     printf("*p = %d \n", *p);  
  30.   
  31.     return p;  
  32. }  
通過運行結果,可以看出,指針函數f返回的類型是一個指針類型,因爲f是賦值給int類型指針p1的,如果不是指針類型,編譯就會出錯。

下面是運行結果:


從上圖的運行結果可以看出,指針函數f的返回值p和f賦值給的指針p1的地址是相同的,都是指向指針函數內部申請的內存地址0x3b88d0。


下面是debug查看的指針p1和指針p的內存地址。

(1)指針p1剛定義時的指向NULL,也就是空指針,地址是0。p1的地址如紅色框內所示,p1地址爲0x00000000。


(2)指針函數f內的返回值p的地址如下圖中紅色框內所示,p的地址是0x003b88d0:


(3)執行完指針函數f後,把f的返回值p賦給先前定義的地址p1,此時p1的地址和p的地址相同。p1的地址如下圖中紅色框內所示,p1的地址是0x003b88d0,與p的地址相同,p的地址如下圖中藍色框內所示,並且兩者的值也都是3,因爲是指向同一個地址,所以值必然相同:


所以,指針函數就是返回一個地址給調用者,用於需要地址的情況。


2.函數指針

顧名思義,函數指針說的就是一個指針,但這個指針指向的函數,不是普通的基本數據類型或者類對象。

函數指針的定義如下:

[cpp] view plain copy
  1. int (*f)(int a, int b); // 聲明函數指針  
通過與1中指針函數的定義對比可以看到,函數指針與指針函數的最大區別是函數指針的函數名是一個指針,即函數名前面有一個指針類型的標誌型號“*”。

當然,函數指針的返回值也可以是指針。

上面的函數指針定義爲一個指向一個返回值爲整型,有兩個參數並且兩個參數的類型都是整型的函數。

下面是利用函數指針分別求兩個整數的最大值和最小值的用法。

[cpp] view plain copy
  1. /* 
  2.  * 求最大值 
  3.  * 返回值是int類型,返回兩個整數中較大的一個 
  4.  */  
  5. int max(int a, int b) {  
  6.     return a > b ? a : b;  
  7. }  
  8.   
  9. /* 
  10.  * 求最小值 
  11.  * 返回值是int類型,返回兩個整數中較小的一個 
  12.  */  
  13. int min(int a, int b) {  
  14.     return a < b ? a : b;  
  15. }  
  16.   
  17. int (*f)(intint); // 聲明函數指針,指向返回值類型爲int,有兩個參數類型都是int的函數  
  18.   
  19. int _tmain(int argc, _TCHAR* argv[])  
  20. {  
  21.     printf("------------------------------ Start\n");  
  22.   
  23.     f = max; // 函數指針f指向求最大值的函數max  
  24.     int c = (*f)(1, 2);  
  25.   
  26.     printf("The max value is %d \n", c);  
  27.   
  28.     f = min; // 函數指針f指向求最小值的函數min  
  29.     c = (*f)(1, 2);  
  30.   
  31.     printf("The min value is %d \n", c);  
  32.   
  33.     printf("------------------------------ End\n");  
  34.     getchar();  
  35.     return 0;  
  36. }  

執行結果如下:


發佈了91 篇原創文章 · 獲贊 55 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章