走过路过不要错过!!!指针进阶(二)

目录

      一、函数指针

      二、函数指针数组

      三、指向函数指针数组的指针

      四、回调函数

一、函数指针

       函数指针和我们前面学习的数组指针非常相似,函数名与&函数名的地址是一样的,说明函数名就是函数的地址。

       从上面可以看出输出的是两个地址,这两个地址是 test 函数的地址。

       函数指针有三部分组成:类型、指针、形参。类型和形参都允许为空,当我们想要调用函数时,只需要通过指针,并传入参数,就能正常使用函数。

       上面我运用了函数指针的方法写了一个简单的加法函数。

       下面的两段代码非常有趣,大家尝试的做一做,里面附有解析


二、函数指针数组

       什么是函数指针数组呢? 在前面我们已经学过指针数组的概念了,其实本质上是一个数组,用来存放指针的数组,在这里我们可以得到函数的地址,因此我们就可以将一些函数地址存入数组中,这样我们就得到了函数指针数组。

int (*p[10])();

 p先和[ ]结合,说明p是数组,数组的内容是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;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0, Add, Sub, Mul, Div }; //转移表
	while (input)
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);
		if ((input <= 4 && input >= 1))
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
			printf("ret = %d\n", ret);
		}
		else if (input >=5 )
			printf("选择错误,请重新输入!\n");
	}
	printf("退出计算器\n");
	return 0;
}


三、指向函数指针数组的指针

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


四、回调函数

       回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

        下面是qsort函数的使用:

        qsort函数的返回值是void,base负责接收传入的地址,类型是void*,使用空指针的好处是可以接受各种类型的数据地址;num是待排序的元素个数,类型是size_t(无符号整型);size是单个元素的大小,类型也是size_t;compar是一个函数指针,返回值是int,还有两个形参。

        qsort函数还可以用于字符型排序,结构体型排序。

       到这里指针的内容基本已经更新完了,希望可以更好的帮助大家了解指针,继续探索指针的奥妙,征服指针。

       本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

 

老铁们,记着点赞加关注哦!!!

  • 4
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 3
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论 3

打赏作者

x一季花开成海x

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值