0.区分指向函数的指针和返回指针的函数
int *f();
()的优先级高于间接访问的优先级,所以先执行(),因此f是一个函数,之后返回一个指向int的指针。
int(*f)();
先进行了间接访问,所以f是一个指针,之后进行了函数调用,所以f是一个指向函数的指针。
int *(*f)();
f是一个指向函数的指针,返回的是指向整数的指针。
int (*f[])();
f是一个数组,取得数组中一个元素后,进行了间接操作,得到的是一个函数,函数的返回值是整形。所以f是一个元素为指向返回值位整型的函数的数组。
int *(*f[])();
f是一个数组,包含的元素是指向函数的指针,函数的返回值为int *。
void ToUpper(char *);
void(*pf)(char *);
pf=ToUpper;//pf=&ToUpper也是可以的,本来函数名也是一个地址(或者说是指针),&只是显示的说明了编译器将隐式执行的任务。
char miss[]="I am who I am";
(*pf)(miss);
pf(miss);
这里讲一下函数调用的过程
ToUpper(miss);
首先函数名ToUpper被转换成一个函数指针,并指向函数在内存中的位置。然后,函数调用操作符调用该函数,执行开始于这个地址的代码。
应用
c语言没有重载,那么指向函数的指针可以用在和类型无关的一些函数里。
#include<stdio.h> Node * search_list(Node *node,void const *value,int (*compare)(void const *,void const *)) { while(node != NULL){ if( !compare( &node->value, value)) break; node = node->link; } return node; }
compare_ints( void const *a,void const *b) { if ( *(int *)a == *(int *)b) return 0; else return 1; } int main(void) { desired_node = search_list(root, &desired_value, compare_ints); return 0; }
衣带渐宽终不悔,为伊消得人憔悴