一、怎樣定義函數(shù)指針變量?
下面的語句,定義一個(gè)函數(shù)指針fnPtr:
int (*fnPtr) (void);
這與函數(shù)定義行相似,但有兩點(diǎn)不同:
1 加了星號(hào),說明是指針
2 指針名連同星號(hào)外面加了圓括號(hào)
這兩點(diǎn)把它與函數(shù)定義行區(qū)分開來。
與函數(shù)定義行相同的是返回類型有函數(shù)參數(shù),這兩者寫法一致。
二、怎樣將函數(shù)指針賦給函數(shù)指針變量?
首先,函數(shù)需要先定義。
前面的例子中,如果事先定義了一個(gè)函數(shù)
lookup:
int lookup (void);
我們就可以執(zhí)行下面的語句:
fnPtr = lookup;
這個(gè)語句將lookup的指針賦給fnPtr.
也可以寫成
fnPtr = &lookup;
但是用不著。
三、怎樣用函數(shù)指針變量調(diào)用函數(shù)?
如果函數(shù)指針變量指向了一個(gè)特定的函數(shù),則可以用它來調(diào)用這個(gè)函數(shù)。
在上面的例子中,fnPtr已經(jīng)指向了函數(shù)lookup,所以,下面的語句就調(diào)用函數(shù)lookup:
entry = fnPtr ();
也可以用:Entry = (*fnPtr) ()
兩者的功能一樣。
四、函數(shù)指針變量的用處
1 將函數(shù)指針變量作函數(shù)的參數(shù)。
2 將函數(shù)指針放進(jìn)數(shù)組中。
下面舉qsort函數(shù)的例子,它有個(gè)函數(shù)指針參數(shù):
void qsort (arr, n, size, comp_fn)
原型:void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
使用它的示例程序:
#include <stdio.h>
#include <stdlib.h>
int comp_ints_asc (void *p1, void *p2)
{
? ? int i1 = * (int *) p1;
? ? int i2 = * (int *) p2;
? ? return i1 - i2;
}
int comp_ints_des (void *p1, void *p2)
{
? ? int i1 = * (int *) p1;
? ? int i2 = * (int *) p2;
? ? return i2 - i1;
}
int main (void)
{
? ? int comp_ints (void *, void *);
? ? int data[10]={8,7,-3,-1,9,6,8,7,3,1};
? ? int i;
? ? qsort (data, 10, sizeof(int), comp_ints_asc);
? ? for (i=0;i<10;i++){
? ? ? ? printf("%i ",data[i]);
? ? }
? ? printf("\n\n");
? ? qsort (data, 10, sizeof(int), comp_ints_des);
? ? for (i=0;i<10;i++){
? ? ? ? printf("%i ",data[i]);
? ? }
? ? printf("\n");
}