一、定义函数地址
- 如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。
- 函数名就是地址,这和数组名就是地址类似。
二、如何定义一个函数指针
跟普通变量一样:
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;
}
输出结果: