拿捏c语言指针(下)

前言

此篇讲解的主要是函数与指针的那些事~

书接上回 拿捏c语言指针(上)拿捏c语言指针(中)

​​​​​​没有看的小伙伴要抓紧喽~

欢迎关注​​个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



函数指针变量

函数指针变量 用于存放函数的地址

其中**,函数名==函数地址,**&Add可以换成Add

*pf==&Add ,也就是说Add、*pf、pf三者都可以调用函数

两段有趣的代码

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

拆分(*( void(*)() )0)()

void(*)()函数指针类型,此函数没有参数,返回值是void

( void(*)() )0 是将0这个整数值强制类型 转换为一个函数的地址。

*( void(*)() )0 是解引用,

(*( void(*)() )0)() 是调用地址为0处的函数

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

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

signal是一个函数 ,其参数 有2个,int 类型和函数指针 类型void(*)(int),该指针指向的函数参数是int,返回值是void。

signal函数的返回类型是void(* )(int)函数指针 类型,该指针指向的函数参数是int,返回值是void。

typedef类型重命名

  • 可以将复杂的类型名字重命名

如:typedef unsigned int uint;

  • 对于指针类型重命名

如:typedef int* ptr_t;

  • 对于数组指针函数指针 类型重命名 与以上有区别, 新的名字要放在里面

如:typedef int(*parr_t) [5]; parr_t是数组指针类型新的名字

如:typedef void(*pf)(int); pf是函数指针类型新的名字

所以我们可以将void(* signal (int,void(*)(int)))(int);

简化为以下两句代码

typedef void(*ptr_t )(int) ; 重命名void(*)(int)ptr_t

ptr_t signal(int,ptr_t); signal函数的参数类型是int和ptr_t,返回值类型是ptr_t


函数指针数组

函数指针数组本质 上是一个数组 ,里面存放 的是函数指针变量

如下代码中

int(*pfArr[4])(int, int) = { Add,Sub,Mul,Div };//pfArr就是一个函数指针数组,可以存放4个元素

复制代码
//加法函数
int Add(int x, int y)
{
	return x + y;
}
//减法函数
int Sub(int x, int y)
{
	return x - y;
}
//乘法函数
int Mul(int x, int y)
{
	return x * y;
}
//除法函数
int Div(int x, int y)
{
	return x / y;
}
int main()
{
	int(*pf)(int, int) = &Add;//pf是函数指针
	int(*pfArr[4])(int, int) = { Add,Sub,Mul,Div };//pfArr是函数指针数组
	return 0;
}

函数指针数组应用--实现一个简易计算器

实现一个简易计算器,有 加减乘除 功能。

代码实现

利用函数指针数组存放计算函数地址,方便调用。

如下代码中,int(*pfArr[5])(int, int) = {NULL ,Add,Sub,Mul,Div };数组下标0处设为NULL,方便其他计算函数对应菜单标号

复制代码
#include<stdio.h>
//计算器菜单
void menu()
{
	printf("*****************************\n");
	printf("***   1.Add   2.Sub       ***\n");
	printf("***   3.Mul   4.Div       ***\n");
	printf("***   0.exit              ***\n");
	printf("*****************************\n");
}
//加法函数
int Add(int x, int y)
{
	return x + y;
}
//减法函数
int Sub(int x, int y)
{
	return x - y;
}
//乘法函数
int Mul(int x, int y)
{
	return x * y;
}
//除法函数
int Div(int x, int y)
{
	return x / y;
}
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int(*pfArr[5])(int, int) = { NULL,Add,Sub,Mul,Div };//pfArr是函数指针数组
	//                            0   1   2    3    4
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出计算器\n");
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入两个操作数:>");
			scanf("%d%d", &x, &y);
			int ret = pfArr[input](x,y);
			printf("结果是:%d\n", ret);
		}
		else
		{
			printf("选择错误,请重新选择\n");
		}

	} while (input);
	return 0;
}

结果展示


回调函数

回调函数就是⼀个通过函数指针调⽤的函数。

把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。

其中qsort函数的运用是 回调函数 典例

可以参考 手撕qsort函数~​​​​​​​本篇就不再赘述了

相关推荐
小麦嵌入式11 分钟前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
The Future is mine13 分钟前
Python计算经纬度两点之间距离
开发语言·python
Enti7c14 分钟前
HTML5和CSS3的一些特性
开发语言·css3
爱吃巧克力的程序媛21 分钟前
在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
开发语言·qt
独好紫罗兰1 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法
jelasin1 小时前
LibCoroutine开发手记:细粒度C语言协程库
c语言
篝火悟者1 小时前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
genispan2 小时前
QT/C++ 多线程并发下载实践
开发语言·c++·qt
-代号95272 小时前
【JavaScript】十三、事件监听与事件类型
开发语言·javascript·ecmascript
写代码的小王吧2 小时前
【Java可执行命令】(十)JAR文件签名工具 jarsigner:通过数字签名及验证保证代码信任与安全,深入解析 Java的 jarsigner命令~
java·开发语言·网络·安全·web安全·网络安全·jar