一看就懂的函数指针

首先区分一下,指针函数和函数指针。

  • 指针函数是一个函数,使用指针变量作为函数的返回值,就是指针函数。int *p();
  • 函数指针是一个指针,指向一个函数的指针。int (*p)();

再详细说明一下函数指针。

  • 指针都是记录地址的嘛,这一点是一样的,所以函数在编译器里面也是用地址表示的,故可以用指针来存放函数的地址,所以在用的时候要加一个*在函数指针的前面。
  • 不同于其他指针的是函数指针有函数的属性,比如参数和返回值,函数指针定义:int(*fp)(int,int);该fp指针指向一个返回值为int,参数也为int的一个函数,这样定义一个指针就是函数指针。跟定义一个函数很类似!*fp可以看作一个函数名,fp是函数名的地址。

接下来用一个代码案例说明一切,注释详细,耐心看完看懂,相信会有所获的。

#include<stdio.h>
int add(int,int);//小知识:声明函数的时候函数的参数名可以省略,但是参数类型(int,char,等...)和函数名不可以省略。 
int sub(int,int);
int calc(int (*)(int,int),int,int);//该函数由一个函数指针类型作为参数和两个int类型作为参数,一共三个参数 
int (*select(char))(int,int);//声明一个返回值为 函数指针类型 的函数,该函数本身的传入参数为char型,因为一个函数有两部分,一是返回值类型,二是传入的参数类型 
 
int add(int num1,int num2) //实现加法 
{
	return num1+num2;
}

int sub(int num1,int num2) //实现减法 
{
	return num1-num2;
}

int (*select(char op))(int,int)//利用用户的输入的'+'或者'-'来判断应该用哪个运算法则,仅仅是判断应该用哪个法则,不做计算! 
{
	switch(op)
	{
		case'+':return add;//add是一个函数、地址。 
		case'-':return sub;
	}
}

int calc(int(*fp)(int,int),int num1,int num2)//传入刚刚判断好要用的运算法则和要计算的值,并嵌套调用运算法则的函数进行计算。 
{
	return (*fp)(num1,num2);	//(*fp)fp只是函数的地址,因为函数指针是存地址的,所以*fp才指函数,然后传入该函数的参数 
}

int main()
{

	int num1,num2;
	char op;
	int (*fp)(int ,int);//定义一个函数指针 该指针指向的函数返回值为int,参数有两,都为int类型 
	
	printf("请输入一个式子(如 1+3):");
	scanf("%d%c%d",&num1,&op,&num2);
	
	fp=select(op);//记录利用select函数选好的运算法则 select函数返回的是一个函数,但是函数可以由地址表示,当然可以传入一个函数指针类型里面  
	printf("%d %c %d = %d",num1,op,num2,calc(fp,num1,num2));//用calc函数计算结果。 
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值