[c语言]揭开函数指针的面纱

一、定义函数地址

  • 如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。
  • 函数名就是地址,这和数组名就是地址类似。

二、如何定义一个函数指针

跟普通变量一样:

int a;
int *p;

char c;
char *p;

int getData(int a,int b);
int (*p)(int a,int b);

三、如何使用函数指针

函数调用概念和变量一样:

  • 直接访问:变量名(函数名)
  • 间接访问:指针(函数指针)
//一、如何定义一个函数指针
void (*p2)();//1、如何表示指针:*    2、如何知道是函数: ()    3、函数指针是专用的,格式要求很强(参数类型  个数  返回值),就像数组指针一样

//二、如何给函数指针赋值,相当于把函数地址传给指针p2
p2 = add;
//三、如何通过函数指针调用函数
p2();//直接通过指针名字+()
(*p2)();//取内容  (*指针名字)()

四、用函数指针实现一个小练习

问题:有两个整数a和b,由用户输入1,2或3。如输入1,程序就给出a和b中大者,输入2,就给出a和b中小者,输入3,则求a和b之和。

#include<stdio.h>
#include<stdlib.h>

int Add_data(int *data1,int *data2)
{
	int data;
	data = (*data1) + (*data2);
	return data;
}

void dataHandler(int *data1,int *data2,int (*prr)(int *data1,int *data2))//int (*prr)(int *data1,int *data2)为函数指针
{

	int ret = (*prr)(data1,data2);// (*prr)(data1,data2)进行函数调用
	printf("%d\n",ret);
}
int Min_data(int *data1,int *data2)
{
        int data;
        if((*data1)<(*data2))
	{
		data = *data1;
	}
	else if((*data1) == (*data2))
	{
		data = *data1;
	}
	else{
		data = *data2;
	}
        return data;
}
int Max_data(int *data1,int *data2)
{
        int data;
        if((*data1)>(*data2))
        {
                data = *data1;

        }
        else if((*data1) == (*data2))
        {
                data = *data1;
        }
        else{
                data = *data2;
        }
        return data;
}


int main()
{
	int cmd;
	int a=10;
	int b=20;
	int (*prr)(int *data1,int *data2);//定义一个函数指针


	printf("请输入cmd的值(1、2、3中选择):\n");
	scanf("%d",&cmd);

	switch(cmd)
	{
		 case 1:
			printf("输出a和b中的最大值\n");
                        prr = Max_data;
			break;
		 case 2:
			printf("输出a和b中的最小值\n");
                        prr = Min_data;
			break;
		 case 3:
			printf("输出a和b的和\n");
			prr = Add_data;
                        break;
		default:
			printf("输入错误,臣先告退了\n");
			exit(-1);
			break;

	}
	
	dataHandler(&a,&b,prr);
	return 0;
}

输出结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃秃秃秃哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值