文章目录本节代码高能全程高能呦。适当摸摸鱼,调整自身状态。不要忘记锻炼呀,有钱也得有命花才行呀~给家人打个电话,唠唠家常。
- 前言
- 1. 函数指针
- 1.1 函数指针格式
- 1.2 函数指针调用
- 1.3 实例解读
- 2.函数指针数组
- 3. 计算器实现
前言
本节主要用到函数指针相关知识,感受函数指针的高效高能。首先是实现计算器,第二是实现比较任意类型数据的冒泡排序。
1. 函数指针
函数也有地址,指向函数的指针就是函数指针。
1.1 函数指针格式函数的地址用函数名或者&函数名表示。函数指针的格式是 函数返回值类型 (*指针名) (参数名)
int test(int int); int (*pt)(int, int) = &test; //pt是指向test函数指针 int(*pta)(int, int) = test //函数名也能直接表示函数地址1.2 函数指针调用
以上面实例为例,调用格式为
(*pt)(2,3); 或者 (pta)(2,3)
对pt指针解引用,找到函数,调用函数传参。因为指针pta可以直接替换函数test,所以不加‘ * ’也可以。两种方式都合法。
1.3 实例解读- 观察如下代码,这个代码是在做什么呢?花时间,分解一下呦,提示:从0突破
(* (void (*) () )0) ();
答案:此代码为通过函数指针调用首地址为0的函数。
解析:从0开始,0前面是一个括号(void (*) ()),是一个函数指针,在0前面,意为强制类型转换,将0强制转为函数指针类型。再往前,有一个‘ * ’,对0函数指针解引用,最后面的括号是在传参。
2. 观察如下代码,说出代码作用。提示:signal是函数名还是指针名呢?
void (* signal(int, void(*)(int))) (int);
答案: 这是一个函数声明,函数是返回值为void(*)(int)类型, 函数名是signal,参数列表是(int, void(*)(int))
解析: 看signal,并没有和‘ * ’括在一起,由于优先级, signal先与后面的括号结合,故signal是一个函数。 后面紧跟的(int, void(*)(int))是函数signal的参数列表。 将signal(int, void(*)(int))抠出来,会发现还剩下void(*)(int) 这是一个函数指针,这里作为signal函数的返回值类型,大家要注意这种特殊的写法呀
代码优化
上面的写法很难分析,我们可以使用typedef对类型重命名
例如,将unsigned int 换成unit
typedef unsigned int unit;
应用:将上面的void(*)(int)换成pf_t
typedef void(*pf_t)(int)
void (* signal(int, void(*)(int))) (int); 被替换为 pf_t signal (int, pf_t);2.函数指针数组
函数指针数组是一个数组,数组的每一个元素是函数地址。通过函数地址调用函数。通过下面实例说明。
3. 计算器实现#define _CRT_SECURE_NO_WARNINGS #includevoid menu() { printf("****************************n"); printf("****************************n"); printf("***** 1.Add 2.Sub ******n"); printf("***** 3.Mul 4.Div ******n"); printf("***** 5.Sur 0.Exit *****n"); printf("****************************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 Sur(int x, int y) { return x % y; } int main() { int input; int (*parr[6])(int, int) = { 0,Add,Sub,Mul,Div,Sur }; do { menu(); printf("请选择操作:>"); scanf("%d", &input); if (input == 0) printf("退出"); else if (input >= 1 && input <= 5) { int x = 0; int y = 0; printf("请输入两个操作数:>"); scanf("%d %d", &x, &y); int ret = parr[input](x, y); printf("结果为%dn", ret); } else printf("输入错误"); } while (input); }
解析:
int (*parr[6])(int, int) = { 0,Add,Sub,Mul,Div,Sur };
parr为函数指针数组,,包含6个元素,每一个元素是函数地址。
书写就是在函数指针 int(*) (int,int)的基础上加上数组类型parr[6]
调用函数方法: parr[input](x, y);



