一沙热、怎樣定義函數(shù)指針變量脓斩?
下面的語句香椎,定義一個函數(shù)指針fnPtr:
int (*fnPtr) (void);
這與函數(shù)定義行相似,但有兩點不同:
1 加了星號抗斤,說明是指針
2 指針名連同星號外面加了圓括號
這兩點把它與函數(shù)定義行區(qū)分開來囚企。
與函數(shù)定義行相同的是返回類型有函數(shù)參數(shù),這兩者寫法一致瑞眼。
二龙宏、怎樣將函數(shù)指針賦給函數(shù)指針變量?
首先伤疙,函數(shù)需要先定義银酗。
前面的例子中,如果事先定義了一個函數(shù)
lookup:
int lookup (void);
我們就可以執(zhí)行下面的語句:
fnPtr = lookup;
這個語句將lookup的指針賦給fnPtr.
也可以寫成
fnPtr = &lookup;
但是用不著徒像。
三黍特、怎樣用函數(shù)指針變量調(diào)用函數(shù)?
如果函數(shù)指針變量指向了一個特定的函數(shù)锯蛀,則可以用它來調(diào)用這個函數(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ù)的例子菌羽,它有個函數(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");
}