1.函数指针--指向函数的指针就是函数指针
#include<stdio.h>
int Add(int x,int y){
return x+y;
}
void cal(int (*pAdd)(int ,int)){
int a=2,b=3;
int ret=(*pAdd)(a,b);
printf("%d\n",ret);
}
int main(){
int arr[5]={0};
int (*p)[5]=&arr;
int (*pAdd)(int,int)=&Add;
int ret = (*pAdd)(2,3);
printf("%d\n",ret);
cal(Add);
return 0;
}
通过这个代码,可以得出指针也可以指向函数的,并且可以用函数指针进行函数嵌套。
(*(void (*)() )0 )()
这个代码是将int 0强制类型转换为函数类型,在对其进行解应用和调用。
以上代码是一次函数调用,调用的是 0 作为地址处的函数。、
1.把 0 强制类型转换为:无参,返回类型是void的函数的地址
2.调用 0 地址处的这个函数
void (* signal( int ,void(*)(int))) (int);
我自己看到这个代码的理解是:这是一个函数的声明。
signal是函数名,以上代码是一次函数声明。
声明的signal函数的第一个参数类型是int,第二个参数类型是函数指针,该函数指针指向的函数参数是int,返回类型是void,signal函数返回类型也是一个函数指针,该函数指针指向的函数参数是int,返回参数是void。
typedef unsigned int uint
把 unsigned int 类型重命名为 uint
typedef void(* pf_t)(int)
把 (void)(*)(int) 类型重命名为 pf_t
通过上面,我们可以改造一下该函数
void(* signal( int, void(*)(int)))(int)
可以改造为
pf_t signal(int,pf_t)
以下是用函数指针的知识写一个计算器:
#include<stdio.h>
int Add(int x,int y){
return x+y;
}
int Sub(int x,int y){
return x-y;
}
int Mul(int x,int y){
return x*y;
}
int Div(int x,int y){
return x/y;
}
void calc(int(*p)(int ,int)){
int ret=0;
int x=0,y=0;
printf("请输入两个数->");
scanf("%d %d",&x,&y);
ret=(*p)(x,y);
printf("%d\n",ret);
}
void menu(){
printf("*******************\n");
printf("****1.加 2.减****\n");
printf("****3.乘 4.除****\n");
printf("****0.退出 ****\n");
printf("*******************\n");
}
int main(){
int input=0;
do{
menu();
printf("请选择功能->\n");
scanf("%d",&input);
switch(input){
case 1:
calc(Add);
break;
case 2:
calc(Sub);
break;
case 3:
calc(Mul);
break;
case 4:
calc(Div);
break;
case 0:
printf("程序退出\n");
break;
default:
printf("输入错误\n");
break;
}
}while(input);
return 0;
}
2.函数指针数组:
把函数指针放在数组中,就是函数指针的数组。
参数相同,返回类型相同可以将其地址放在同一个数组中。
接上面的函数 Add Sub Mul Div的代码做一个函数指针数组:
int (*arr[4])(int ,int)={Add,Sub,Mul,Div};
这个类似于函数指针的写法,只不过括号里面换成了数组。
接下来是运用函数指针数组:
for(int i=0;i<4;i++){
int ret=(*arr[i])(8,4);
printf("%d ",ret);
}
接下来用函数指针数组重写计算器,这样可以更加简便,不再需要switch函数:
#include<stdio.h>
int Add(int x,int y){
return x+y;
}
int Sub(int x,int y){
return x-y;
}
int Mul(int x,int y){
return x*y;
}
int Div(int x,int y){
return x/y;
}
void menu(){
printf("**************************\n");
printf("****1.Add 2.Sub****\n");
printf("****3.Mul 4.Div****\n");
printf("****0.exit****************\n");
printf("**************************\n");
}
int main(){
int (* arr[5])(int ,int)={0,Add,Sub,Mul,Div};//这个0是将这些函数向后移一位,方便选择功能
int input=0;
int x=0,y=0;
int ret=0;
do{
menu();
printf("请输入选择那个功能->\n");
scanf("%d",&input);
if(input==0){
printf("退出计算器\n");
}
else if(input>=1 && input<=4){
printf("请输入两个要计算的数字->\n");
scanf("%d%d",&x,&y);
ret=(*arr[input])(x,y);
printf("%d\n",ret);
}
else{
printf("输入错误,请重新输入\n");
}
}while(input);
return 0;
}