【C语言】你真的了解指针吗?(2)

这是指针的第二篇文章,这篇文章我将会讲解一下函数指针和函数指针数组以及它们的具体使用。

目录

一、函数指针

 二、函数指针数组

函数指针数组的定义以及初始化

 函数指针数组的使用

 三、转移表


一、函数指针

函数指针,顾名思义就是指向函数的指针,接下来我们来看看函数指针使用

void print()
{
    printf ("hello\n");
}
int main ()
{
   void (*p)()=print;
   (*p)();
   return 0;
}

我们来分析一下void (*p)()=print这段代码的组成。

函数指针定义就是由上面3部分组成,这时我们不禁提出几个猜想:①函数名表示函数地址。②小括号的优先级比*号高。

这时我们来几个小实验来论证我们刚刚的猜想

①函数名表示函数地址:

②小括号的优先级比*号高:

这里我将(*p)()变成*p();

这里编译器就报错了,然后我们来看看官方的优先级排序(越靠上优先级越高)

 

 接下来我们来看看两端代码,巩固我们对函数指针的理解

( * (void) (*) ()   0 )   ();

 void ( * signal ( int , void(*)  (int) ) )  (int) ;

 二、函数指针数组

在之前的学习中我们已经见过数组指针数组了,函数指针数组自然不难理解,就是存放类型为函数指针的数组。

这里我们简单举一个函数指针数组的使用例子。

函数指针数组的定义以及初始化

首先我们是要定义一个数组,所以我们先写上arr_print[3],然后再写数组类型,因为我们要存放函数指针类型,所以我们写上void (*)(),void表示函数返回类型,(*)表示是一个指针,然后()表示是一个无参数的函数,这样我们再将arr_print放入括号中,最后就可以对数组进行初始化了,自此,一个函数指针数组arr_print就完成了。(可以不必放指针,直接放入函数名也是可以的,因为函数名就表示函数地址嘛)

 函数指针数组的使用

接下来我们来了解函数指针数组的使用,我们可以使用下标引用操作符,这样就可以拿出数组中的第i个元素。arr_print[0]这样就像当与拿出了函数,即可以调用,然后我们传入参数,因为我们这几个函数都是没有参数的,所以我们直接在后面加上一个空括号即可完成对print函数的调用。(在此注意一定,数组中所有元素类型是相同的,所以我们在使用函数指针数组时,要保证函数指针的返回类型以及函数参数是相同的才能使用)

 三、转移表

我们在学习函数指针数组后,我们可以设计多个具有类似功能的函数,然后用函数指针数组调用它们,这样就可以省略掉相同的代码,从而节省代码量。

那这样我们可以使用函数指针数组来制作一个计算器。因为计算器如果使用函数实现,它们的类型是相同的,从键盘传入两个待操作的参数,无需返回类型,直接打印结果就行了。

#include <stdio.h>
//calc  转移表
void add(int a, int b)
{
	printf("%d\n", a + b);
}
void sub(int a, int b)
{
	printf("%d\n", a - b);
}
void mul(int a, int b)
{
	printf("%d\n", a * b);
}
void div(int a, int b)
{
	printf("%d\n", a / b);
}
int main()
{
	int input = 1;
	void (*p[5])(int, int) = { NULL,add,sub,mul,div };
	int x, y;
	while (input)
	{
		printf("*************    计算器   **************\n");
		printf("********  1.add  *******  2.sub  *******\n");
		printf("********  3.mul  *******  4.div  *******\n");
		printf("请输入操作:\n");
		scanf("%d", &input);
		if ((input) <= 4 && input >= 1)
		{
			printf("请输入操作数\n");
			scanf("%d %d", &x, &y);
			p[input](x, y);
		}
		else
			printf("输入错误\n");
	}
}

会发现,只需要40行代码就可以完成一个计算器的功能,像这种相同类型的函数,我们使用函数指针数组会极大的简化代码量,不需使用switch语句来将用户输入的代码一一判断,然后重复相同的代码。

好了,这篇文章的分享就到这了,如果各位觉得还不错的话,可以留个赞嘛,谢谢各位(如果发现文章有错误的地方可以指向,本人必会第一时间修改)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值