前言
- 本博文代码基于VC++开发调试
- 只是对函数指针的一个学习笔记;
什么是函数指针
显然函数指针是一个指针,而且是一个指向函数的指针;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;
}
运行结果: