HelloWorld

ASM,C,LUA,LINUX(gentoo)
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

指向函数的指针

Posted on 2011-09-19 19:04  光铭  阅读(261)  评论(0编辑  收藏  举报

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);   这两种调用方法 ANSI C是都接受的。

这里讲一下函数调用的过程

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;
}