C语言进阶——指针(下)

目录

前言

 6.函数指针数组

7.指向函数指针数组的指针 

8.回调函数

小纸条 


前言

紧接着上一篇有关指针(上)的详解,指针(下)的详解也新鲜出炉了,请小伙伴们好好品尝哦!

 6.函数指针数组

        数组是一个存放相同数据类型数据的存储空间,在指针(上)一节中,大家已经学习了指针数组,比如:

//数组的每个元素是int *
int*arr[10];

        那要把函数的地址存到一个数组中,那么这个数组就叫函数指针数组,那函数指针该如何定义呢?请看下面这段代码,小伙伴们快来判断一下吧!

int (*parr1[10])( );

int *parr2[10]( );

int (*) ( )parr3[10]

        相信聪明的小伙伴们已经猜到了答案是parr1。parr1先与【】结合,说明parr1是数组,那么数组的内容是什么呢,是int(*)()类型的函数指针。

        那么函数指针数组有什么用途呢,答案就是转移表 

        接下来以计算器这个功能的实现来具体应用一下函数指针数组。

/简易整型计算器的实现
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a/b;
}
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 a = 0;
	int b = 0;
	int input = 0;
	int ret = 0;
	do
	{
		menu();
		printf("请选择功能;>");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入两个整形操作数;>");
			scanf("%d %d", &a, &b);
			switch (input)
			{
			case 1:
				printf("%d\n", add(a,b));
				break;
			case 2:
				printf("%d\n", sub(a, b));
				break;
			case 3:
				printf("%d\n", mul(a, b));
				break;
			case 4:
				printf("%d\n", div(a, b));
				break;
			}

		}
		else if (input != 0)
		{
			printf("输入错误,请重新输入\n");
		}

	} while (input);
	return 0;
}

//使用函数指针
int main()
{
	int a = 0;
	int b = 0;
	int input = 0;
	int ret = 0;
	int (*fac[5])(int x, int y) = { 0,add,sub,mul,div };  //转移表
	do
	{
		menu();
		printf("请选择功能;>");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入两个整形操作数;>");
			scanf("%d %d", &a, &b);
			printf("%d/n", (fac[input])(a, b));
			
		}
		else if (input != 0)
		{
			printf("输入错误,请重新输入\n");
		}

	} while (input);
	return 0;
}

        通过上面两种方式对于简易计算器的程序书写,我们发现函数指针数组确实会给我们书写某些代码的时候带来一定的便利和效率。

7.指向函数指针数组的指针 

        首先我们要明确,指向函数指针数组的指针是一个指针

        这个指针指向的是一个数组,数组的元素都是函数指针

        那么该如何定义呢?请看下面代码。

void test(const char* str)
{
    printf("%s\n",str)
}

int main()
{
    //函数指针pfun
    void (*pfun)(const char*)=test
    //函数指针的数组pfunArr
    void (*pfunArr[5])(const char* str);
    pfunArr[0]=test;
    //指向函数指针数组pfunArr的指针ppfunArr
    void (*(*ppfunArr)[5])(const char* str)=&pfunArr;
    return 0;
}

8.回调函数

        回调函数就是一个通函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件大声时由另一方调用的,用于对该事件或条件进行响应。 具体的代码实现会在下一节的模拟实现qsort函数中体现,千万不要错过哦!

小纸条 

希望看到这里的兄弟们可以点点赞,走走关注,相互学习,一起进步呀!

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_麦麦_

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值