C語言指針函數和函數指針

定義方法

指針函數:   函數類型   *函數名(形參列表)

函數指針:   函數類型  (*指針變量名)(形參列表)

指針函數的實質就是一個函數,不過它的返回值是指針。所以重點談一下函數指針。

在程序運行中,函數代碼是程序的算法指令部分,它們和數組一樣也佔存儲空間,都有相應的地址。可以使用指針指向數組的首地址,也可以使用指針變量指向函數代碼的首地址,指向函數代碼首地址的指針稱爲函數指針,它的定義方法如上。

上面的紅色部分就是函數指針的名稱,函數類型指的是該指針指向的函數的返回類型。形參列表指的是該指針指向的函數的形參列表。

注意:函數指針和它指向的函數的參數個數及類型必須一致。

如 int (*fu)(int x);     /*定義一個函數指針*/

函數指針的賦值

函數指針名代表了函數代碼的首地址,因此賦值時直接將函數指針指向函數名就行了。例如:

int func(int x);      /*聲明一個函數*/

int (*fu)(int x);     /*聲明一個函數指針*/

fu = func;

賦值時func不帶括號以及參數,因爲func代表函數的首地址,fu = func就是一個地址賦給一個指針。

定義函數指針類型

typedef  int  (*PTRFUN)(int a);      //第一

它相當於

typedef  int (*)(int a)  PTRFUN;       //第二

但是這樣寫顯然很亂,讓人一眼看不清,所以就固定成第一種形式。它和

int  (*fu)(int a);

的區別是後者只是定義了一個函數指針,而前者是定義了函數指針類型PTRFUN,可以用它來定義其它函數指針,如

PTRFUN  pFun;

函數指針變量常見的用途是把函數指針作爲參數傳給其它函數,而這些“其它函數”除了函數指針這個參數以外一般還有其它參數,而此函數指針指向的函數往往就是處理這些“其它參數”的。例

 

  1. #include<stdio.h> 
  2.  
  3. max(int x, int y) 
  4.     int z; 
  5.     if(x>y) z=x; 
  6.     else z=y; 
  7.     return (z); 
  8. min(int x, int y) 
  9.     int z; 
  10.     if(x<y) z=x; 
  11.     else z=y; 
  12.     return (z); 
  13. add(int x, int y) 
  14.     int z; 
  15.     z=x+y; 
  16.     return (z); 
  17. process(int x, int y, int (*fun)(intint)) 
  18.     int result; 
  19.     result=(*fun)(x,y); 
  20.     printf("%d\n", result); 
  21. main() 
  22.     int max(intint); 
  23.     int min(intint); 
  24.     int add(intint); 
  25.     int a,b; 
  26.     printf("enter a and b:"); 
  27.     scanf("%d,%d",&a,&b); 
  28.     printf("max="); 
  29.     process(a,b,max); 
  30.     printf("min="); 
  31.     process(a,b,min); 
  32.     printf("sum="); 
  33.     process(a,b,add); 

運行結果:

 

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