函数指针 函数指针数组 三种计算器的方法 用函数指针写计算器和用函数指针数组写计算器

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;
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值