函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码。一个函数的地址是该函数的进入点,也是调用函数的地址。函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数。
不带括号和变量列表的函数名,这可以表示函数的地址,正如不带下标的数组名可以表示数组的首地址。
定义形式:
类型 (*指针变量名)(参数列表);
例如:
int (*p)(int i,int j);
p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。p首先和*结合,表明p是一个指针。然后再与()结合,表明它指向的是一个函数。指向函数的指针也称为函数指针。
int LocateElem(SqList L, ElemType e, Status(*compare)(ElemType, ElemType)){
// 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果:返回L中第1个与e满足compare()的数据元素的位序
// 若这样的数据元素不存在, 则返回值为0。算法2.6
// compare为满足一定条件的一类函数,称为函数类形参
ElemType *p;
int i = 1; // i的初值为第1个元素的位序
p = L.elem; // p的初值为第1个元素的存储位置
while(i<=L.length && !compare(*p++,e))
i++;
if(i<=L.length)
return i;
else
return 0;
}
int *f(int i, int j);
int (*p)(int i, int j);
前者是返回值是指针的函数;后者是一个指向函数的指针