这是指针的第二篇文章,这篇文章我将会讲解一下函数指针和函数指针数组以及它们的具体使用。
目录
一、函数指针
函数指针,顾名思义就是指向函数的指针,接下来我们来看看函数指针使用
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语句来将用户输入的代码一一判断,然后重复相同的代码。
好了,这篇文章的分享就到这了,如果各位觉得还不错的话,可以留个赞嘛,谢谢各位(如果发现文章有错误的地方可以指向,本人必会第一时间修改)


28万+

被折叠的 条评论
为什么被折叠?



