[C]函数指针

一、声明

一个函数在编译时被分配一个入口地址。这个入口地址就成为函数的指针。像其他函数一样,函数指针也指向某个特定的类型。函数类型尤其返回类型以及形参表确定,与函数名无关。

int  (*p) (int, int);

这个语句将p声明为指向函数的指针变量,该函数会有两个整型参数,返回值为整型。 *p两侧的括号是必需的,表示p先与*结合,是指针变量,然后再与后面的()结合,表示此指针指向函数,如果写成 int *p (int, int);这就声明成一个p函数了,该函数返回一个指向int型的指针。

另外,可以使用typedef来简化声明:

typedef int *pFunc (int, int);

表示pFunc是一种指向函数的指针类型。

二、初始化和赋值

在给函数指针变量赋值时,只需给出函数名而不必给出参数,例如:

p=max;

将函数的入口地址赋给p,而不涉及实参与形参的问题。
函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。不同类型的指针之间不存在转换。

三、调用

#include<stdio.h>
typedef int (*pFunc) (int, int);
int max(int a, int b)
{
	return a>b?a:b;
}
void main()
{
	int a=3,b=5;
	pFunc p;
	p=max;
	int c = p(a, b);
	//int c = (*p)(a, b);
	//int c = max(a, b);
	printf("%d",c);	
}

四、将函数指针用作形参

函数指针变量通常的用途之一是吧指针作为参数传递到其他函数。有两种方法可以声明:

void sub (int (int, int), int (int, int));
void sub (int (*)(int, int), int (*)(int, int));
//可以这么定义:
void sub(int (*x1)(int), int (*x2)(int, int))
{
	int a,b,i,j;
	a = (*x1)(i);
	b = (*x2)(i,j);
	......
}

当然,如果sub函数仅仅只会用到f1,f2函数则完全不必要这样。但是如果在每次调用sub函数时,要调用的函数不是固定的,这次调用f1和f2,侧下次可能要调用f3和f4。此时用指针变量来传递函数就方便多了。只要在每次调用sub函数给出不同的函数名作为实参即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值