指向函数的指针_函数指针(function pointer)

转自 https://blog.csdn.net/str999_cn/article/details/78591369
程序是仿照小甲鱼老师的课程写的:https://fishc.com.cn/forum.php


函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码。一个函数的地址是该函数的进入点,也是调用函数的地址。函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数。

不带括号和变量列表的函数名,可以表示函数的地址,正如不带下标的数组名可以表示数组的首地址。

定义形式:
类型(*指针变量名)(参数列表);
例如:

	int(*p)(int i, int j);
	int(*p)(int, int);

p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。p首先和*结合,表明p是一个指针。然后与后面 () 结合,表明它指向的是一个函数。指向函数的指针也称为函数指针。


小程序验证一下:

#include<stdio.h> 

int add(int, int);	//2数相加
int sub(int, int);	//2数相减
int calcu(int(*)(int,int), int ,int);	//第一个参数是函数指针,决定执行加还是减。

int (*select(char))(int, int);		//根据优先级结合性,可以看出这是一个函数select(char),
					//返回值是指针*,指针*指向的是一个函数int (int ,int),
					//所以这是一个返回值是函数指针的函数。

int add(int num0, int num1)
{
	return num0 + num1;
}

int sub(int num0, int num1)
{
	return num0 - num1;
}

int calcu(int(*fp)(int ,int), int i, int j)
{
	return (*fp)(i, j);
}

int (*select(char op))(int,int)    //根据op是'+'还是'-',返回add或sub
{
	switch(op)
	{
		case '+': return add;
		case '-': return sub;
	}
}
int main() 
{
	int (*p)(int i, int j), (*n)(int , int );	//声明p、n两个函数指针
	p = add;
	n = sub;

	printf("p(3,4) = %d\n",p(3, 4));	//养成良好编程习惯此处用p(3,4)也可以正确运行,
	printf("(*p)(3,4) = %d\n",(*p)(3,4));	//但为了说明函数是通过指针调用的,
	printf("add(3,4) = %d\n\n",add(3, 4));	//使用(*p)(3,4)会容易阅读和维护。
								
	printf("p = %p\n",p);		 //函数指针p和*p地址是相同的。
	printf("(*p) = %p\n\n",*p);       

	printf("calcu(p,3,4) = %d\n", calcu(p,3,4));
	printf("calcu(n,3,4) = %d\n\n", calcu(n,3,4));
	
	printf("calcu(select('+'),3,4) = %d\n", calcu((select('+')),3,4));
	printf("calcu(select('-'),3,4) = %d\n", calcu((select('-')),3,4));
	return 0;
}

运行结果如下:
在这里插入图片描述

程序小结:

*1、函数指针p 和(p) 作用一样。
2、函数指针可以做参数。
3、函数指针可以做返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值