定義方法
指針函數: 函數類型 *函數名(形參列表)
函數指針: 函數類型 (*指針變量名)(形參列表)
指針函數的實質就是一個函數,不過它的返回值是指針。所以重點談一下函數指針。
在程序運行中,函數代碼是程序的算法指令部分,它們和數組一樣也佔存儲空間,都有相應的地址。可以使用指針指向數組的首地址,也可以使用指針變量指向函數代碼的首地址,指向函數代碼首地址的指針稱爲函數指針,它的定義方法如上。
上面的紅色部分就是函數指針的名稱,函數類型指的是該指針指向的函數的返回類型。形參列表指的是該指針指向的函數的形參列表。
注意:函數指針和它指向的函數的參數個數及類型必須一致。
如 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;
函數指針變量常見的用途是把函數指針作爲參數傳給其它函數,而這些“其它函數”除了函數指針這個參數以外一般還有其它參數,而此函數指針指向的函數往往就是處理這些“其它參數”的。例
- #include<stdio.h>
- max(int x, int y)
- {
- int z;
- if(x>y) z=x;
- else z=y;
- return (z);
- }
- min(int x, int y)
- {
- int z;
- if(x<y) z=x;
- else z=y;
- return (z);
- }
- add(int x, int y)
- {
- int z;
- z=x+y;
- return (z);
- }
- process(int x, int y, int (*fun)(int, int))
- {
- int result;
- result=(*fun)(x,y);
- printf("%d\n", result);
- }
- main()
- {
- int max(int, int);
- int min(int, int);
- int add(int, int);
- int a,b;
- printf("enter a and b:");
- scanf("%d,%d",&a,&b);
- printf("max=");
- process(a,b,max);
- printf("min=");
- process(a,b,min);
- printf("sum=");
- process(a,b,add);
- }
運行結果: