C语言的函数指针数组

引言

首先我们需要先明确一个概念,就是C语言中,函数名称代表的意思。这边就直接公布了,函数名其实就是一个指针,当调用到这个函数名时,跳转到对应的地址,这个大家可以去多了解以下汇编的原理,这里就不细说了。

函数指针数组

顾名思义,函数指针数组,表示的是一个数组,里面存放的内容是函数指针。那什么是函数指针?指向函数的指针,这样一来,我们就理解了这一概念了。

OK,概念讲完了,我们来举个例子增强一下理解。

void my_print1(void) {
	printf("This is printf1!\n");
}

void my_print2(void) {
	printf("This is printf2!\n");
}

void my_print3(void) {
	printf("This is printf3!\n");
}

typedef void (*fun) (void);
fun cortex[3] = { my_print1 ,my_print2 ,my_print3 };

int main(void) {
	cortex[0]();	//简单调用一下函数,没有返回值,没有输入参数
	cortex[2]();

	return 0;
}

先来看看结果:
在这里插入图片描述
代码很简单,结果也很简单,就是调用了两条函数语句,那么我们如何理解上面这段代码呢?
首先定义的三个函数就不多说了,然后是这条语句:

typedef void (*fun) (void);

上面这条语句的意思就是新定义一个函数指针类型,也就是用这个类型定义出来的变量,就是函数指针,指向函数的指针。这样一来就好解释了,接下来的代码:

fun cortex[3] = { my_print1 ,my_print2 ,my_print3 };

上面这条语句,用fun这个新的类型定义了一个数组,数组名为cortex,数组元素是什么呢——函数名。大家还记得前面提到函数名就是函数的指针,指向函数的地址,那么把函数名作为这个数组的元素,名正言顺!再看最后的main里边的内容:

	cortex[0]();
	cortex[2]();

这种调用方式好奇怪,和以前写的不太一样,但细细想来,这么调用没错,函数名+括号,确实是函数调用的形式,这样一来我们就完成了函数指针数组的创建和调用了。

本来到这里就结束了,但总感觉 typedef void (*fun) (void); 这条语句,咋那么变扭呢,因为这玩意之前没接触过,我也是第一次见,索性就多举几个例子吧

int my_print1(void) {
	printf("This is printf1!\n");
	return 1;
}

int my_print2(void) {
	printf("This is printf2!\n");
	return 2;
}

int my_print3(void) {
	printf("This is printf3!\n");
	return 3;
}

typedef int (*fun) (void);
fun cortex[3] = { my_print1 ,my_print2 ,my_print3 };

int main(void) {
	int a = cortex[0]();	//简单调用一下函数,没有返回值,没有输入参数
	int b = cortex[2]();

	printf("a = %d, b = %d \n", a, b);

	return 0;
}

我们再加点东西上去,比如说加个函数返回值,那么此时我们发现,重定义的语句我们需要改了,要改成 typedef int (*fun) (void); 因为元素的类型是返回int类型的,就是说这个函数指针是指向一个返回值为int类型的函数,那么我们定义的这个型类型也就需要加上int,结果如下:
在这里插入图片描述

OK,最后我们再来看看有参数传入的情况:

int my_print1(int a) {
	printf("This is printf1!, number is :%d\n", a);
	return 1;
}

int my_print2(int b) {
	printf("This is printf2!, number is :%d\n", b);
	return 2;
}

int my_print3(int c) {
	printf("This is printf3!, number is :%d\n", c);
	return 3;
}

typedef int (*fun) (int d);
fun cortex[3] = { my_print1 ,my_print2 ,my_print3 };

int main(void) {
	int a = cortex[0](8);	//简单调用一下函数,没有返回值,没有输入参数
	int b = cortex[2](6);

	printf("a = %d, b = %d \n", a, b);

	return 0;
}

运行结果:
在这里插入图片描述
一目了然,用typedef定义的时候需要加上形参,形参变量名大家可以随便给,这样一个完整的函数指针数组就定义完成了!

写在最后

typedef其实真正的用途就是重定义,大家不必太过去深究,然后我们平常所用到的场合可能会有以下这种情形:
在这里插入图片描述
需要传入的函数形参为 void (*pfnIntHandler)(void),其实这就是要我们传入一个函数名也就是传入一个函数指针就可以了,比如把我们定义的函数指针数组的元素传入,完全可以,或者我们定义了一个函数,直接把函数名写上去就行了。
最后感谢这位老哥写的文章,很有参考价值:
https://blog.csdn.net/dmc111qwf/article/details/80200868

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值