C语言函数指针

前言

  1. 本博文代码基于VC++开发调试
  2. 只是对函数指针的一个学习笔记;

什么是函数指针

显然函数指针是一个指针,而且是一个指向函数的指针;C语言中,定义一个函数后,编译时编译器会为这个函数开辟一段内存空间,函数指针这个内存空间的起始地址(入口地址)成为这个函数的指针;
定义:*类型名 (指针变量名)(函数参数列表)

int (*name) (int a,int b)   //函数类型为整型,指针函数名为name,函数形参为两个整型
{
	//逻辑代码;
	return 未知;
}

函数调用的两种方法:函数名调用法和函数指针变量调用法

1.函数名调用法;(这个太简单,不讨论)
2.指针变量调用法;
举例:(输出两个数中的最大数)

#include <stdio.h>
void main()
{
	int max(int a,int b);
	int (*P_max)(int a,int b);  
	int a,b,c;
	P_max = max;   //将max()函数的入口地址赋给函数指针变量P_max()上;
	printf("请输入a和b的值:\n");
	scanf("%d%d",&a,&b);
	c = (*P_max)(a,b);   //将函数指针变量返回的函数值赋值给c;
	printf("a=%d\nb=%d\nmax=%d\n",a,b,c);	
}
int max(int a,int b)
{
	int temp;
	if(a>b) temp = a;
	else temp = b;
	return temp;
}

特别注意:
int (*p)(int a,int b); 代表定义声明一个返回值为整型值的函数;
int *p(int a,int b); 代表定义声明一个返回值为整型地址的函数;

函数指针的两个特殊应用

应用1:函数指针的灵活赋值
利用函数名调用函数,只能调用所指定的函数,而通过指针变量调用函数就比较灵活了,可以根据具体问题,先后或选择性的对函数指针变量赋值;举例:
要求:输入两个数,,然后让用户选择1或2,选择1时调用max函数,输出两个数中的最大值,选择2时调用min函数,输出两个数中的最小值;

#include <stdio.h>
void main()
{
	int max(int a,int b);
	int min(int a,int b);
	int (*p)(int a,int b);
	int a,b,c;
	printf("请输入两个数:");
	scanf("%d%d",&a,&b);
	printf("请选择1或2:");
	scanf("%d",&c);
	if(c==1)    //通过这么一个选择结构,可以对p进行选择性赋值;
	{
		p = max;      
		printf("两个数的最大值是:%d",(*p)(a,b));
	}
	else if(c==2)
	{
		p = min;
		printf("两个数的最小值是:%d",(*p)(a,b));
	}
	printf("\n");
	
}
int max(int a,int b)
{
	int temp;
	if(a>b) temp = a;
	else if(a<b)temp = b;
	else temp = 0;
	return temp;
}
int min(int a,int b)
{
	int temp;
	if(a<b) temp = a;
	else if(a>b) temp = b;
	else temp = 0;
	return temp;
}

运行结果:
这里写图片描述

应用2:函数指针做函数参数
指针是作为函数参数的一个重要应用;
举例:要求通应用1;

#include <stdio.h>
void main()
{
	int max(int a,int b);
	int min(int a,int b);
	int fun(int a,int b,int (*p)(int a,int b));
	int a,b,c;
	printf("请输入两个数:");
	scanf("%d%d",&a,&b);
	printf("请选择1或2:");
	scanf("%d",&c);
	if(c == 1)  printf("两个数的最小值为:%d",fun(a,b,min));  //在这里min函数将自己的函数入口传给实参p;
	else if(c == 2)  printf("两个数的最大值为:%d",fun(a,b,max));
	else printf("输入错误!");
	printf("\n");
}
int fun(int a,int b,int (*p)(int a,int b))
{
	int temp;
	temp = (*p)(a,b);
	return temp;
}
int max(int a,int b)
{
	int temp;
	if(a>b) temp = a;
	else if(a<b)temp = b;
	else temp = 0;
	return temp;
}
int min(int a,int b)
{
	int temp;
	if(a<b) temp = a;
	else if(a>b) temp = b;
	else temp = 0;
	return temp;
}

运行结果:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值