作者:敲代码の流川枫

博客主页:流川枫的博客

专栏:C语言从入门到进阶

语录:Stay hungry stay foolish

工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

点击免费注册和我一起刷题吧

我们先看一个代码:

#include<stdio.h>
void test()
{printf("haha\n");
}
int main()
{printf("%p\n", test);printf("%p\n", &test);        return 0;
}

输出的是两个地址,函数名就是函数的地址

将函数的地址存起来:

#include<stdio.h>
void test()
{printf("haha\n");
}
int main()
{//函数指针int (*pf)(const char*) = test;(*pf)("abc");pf("abc");test("abc");return 0;
}

函数指针也是一种指针,是指向函数的指针

int (*pf)(const char*) = test

pf先和*结合,是指针,指向test函数,无参数,返回值类型为void

《C陷阱和缺陷》中的一段代码:

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

void(*)()是函数指针类型

( void (*)() )0 是强制类型转换,结果是函数的地址,0地址中存放一个函数,无参数,无返回值

以上代码总体是一次函数调用,调用的是0作为地址处的函数,首先把0强制转换为无参,返回类型是void的函数的地址,其次是调用0地址处的这个函数

再观察这段代码:

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

代码可以化简:

把void(*)(int)重命名为pfun_t

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

signal 与后面的括号结合,是函数名

( int , void(*)(int) ) 是两个参数类型

以上代码是一次函数声明 ,signal函数的第一个参数的类型是int,第二个参数类型是函数指针,该指针指向的是一个参数类型为int,返回值为空的函数,signal函数的返回类型也是一个指针函数,该函数指针也指向的是一个参数类型为int,返回值为空的函数

使用函数指针简化代码:

当功能近似的函数中有较多相同的代码时,可以用函数指针来简化代码

void calc( int(*pf) (int, int) )

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{printf("*****************\n");printf("***1.sum 2.sub***\n");printf("***3.mul 4.div***\n");printf("*****0.退出*****\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;
}
//计算
void calc(int(*pf)(int, int))
{int x = 0;int y = 0;int ret = 0;printf("输入两个操作数:");scanf("%d%d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
}
int main()
{int input = 0;do{menu();printf("请选择");scanf("%d", &input);switch(input){case 1:calc(add);break;case 2:calc(sub);break;case 3:calc(mul);break;case 4:calc(div);break;case 0:printf("退出计算器!\n");break;default:printf("选择错误!\n");break;}} while (input);return 0;
}

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

C语言进阶——函数指针相关推荐

  1. c语言中将函数指针作为形参_在C中将有效指针作为NULL指针

    c语言中将函数指针作为形参 Prerequisite: An Example of Null pointer in C 先决条件: C中的空指针示例 Any pointer that contains ...

  2. c语言函数指针封装函数,C语言之函数指针、回调函数的使用

    一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...

  3. C语言:函数指针与指针函数

    文章目录 C语言:函数指针与指针函数 一.概念 二.创建形式 2.1 普通函数创建形式: 2.2 指针函数创建形式: 2.3 函数指针创建形式: 三.使用例子 3.1 指针函数返回字符串 3.2 函数 ...

  4. c语言visit函数指针,C++中的函数指针总结

    1.函数指针的引出 假设我们需要写个函数 sort( start, end, compare ); 对start 和end 之间的数组元素进行排序compare 定义了比较数组中两个字符串的比较操作. ...

  5. C语言_函数指针高级用法

    什么是函数指针? 函数是计算机程序中一段可执行代码的封装,当程序运行时函数会被加载到内存布局中的代码段位置,这段代码会有一段内存空间,有内存空间就会有地址,这段内存空间的首地址,就是函数的地址 每当我 ...

  6. C语言用函数指针实现数组排序

    最近看C语言有点烦,无论是自学的数据结构还是学校的指针课程,看着头都大了. 学校在PTA安排了此题,提交了多次总是报错,今天重新整理一遍且不按题目编程提示来写,提交终于正确. (其实是最后一个数字不能 ...

  7. c语言 万能函数指针,C/C++编程笔记:C语言精华解析之void *指针,指针中的万能指针...

    什么是万能指针? 万能指针其实就是void *类型的指针,而void *指针一般被称为通用指针或叫泛指针.它是C语言关于纯粹地址的一种约定.当某个指针是void型指针时,所指向的对象不属于任何类型. ...

  8. 【C语言】函数指针(指向函数的指针)

    文章目录 1. 函数指针的定义 2. 函数指针的定义形式 2.1 一般定义方法 2.2 加上typedef关键字的定义 3.利用函数指针调用其所指向的函数 3.1 情况1:一般调用 3.2 情况2:函 ...

  9. C语言中函数指针的主要应用场景

    一个人C语言功底强不强,不是看他写的代码注释够不够全,代码逻辑够不够清晰,看下他对函数指针的理解和使用就可以了.我曾经被一家公司面试两次,两次面试的内容都有对函数指针的使用理解.函数指针的概念上很简单 ...

最新文章

  1. Winform程序只允许应用单开
  2. 来一场说聊就聊的压测分享
  3. crt查看开机日志_电脑开机要几分钟?这几个关键的设置你肯定没有做好
  4. matlab 读取csv_利用Pytorch进行数据加载1--CSV文件的读取和显示
  5. 【Java】ArrayList 列表的泛型
  6. Gentoo 安装日记 02 (建立并启动虚拟机)
  7. 帆软参数面板根据选择项type显示和隐藏参数项(或${if()}在SQL中的用法)根据条件动态显示参数控件
  8. 第四课曲面与曲线方程
  9. Mongodb 可视化工具 mongochef
  10. 汤晓鸥教授的一篇很有意思的文章
  11. Uncaught TypeError: Illegal invocation
  12. Sentinel流量防控卫兵
  13. js递归生成树结构数据
  14. html 设置图片左对齐,CSS设置图片的对齐
  15. 玩游戏计算机虚拟内存怎么设置,玩游戏时提示虚拟内存太小怎么办
  16. 脸部转正!GAN能否让侧颜杀手、小猪佩奇真容无处遁形?
  17. vue影院在线选座--可拖拽、缩放--A/B/C三级座位
  18. SDN控制器关键性能指标及测试方法—Vecloud
  19. 随心听出高质量 百度音乐更新支撑电台
  20. android自定义button样式【转】

热门文章

  1. ionic4自定义插件
  2. 怎么在PDF上直接修改?最新教程来了
  3. pdf文件预览 浏览器窗口名修改
  4. 企业咨询行业拓客的10个经典方法
  5. 计算机类创新论文题目,计算机类学论文选题 计算机类论文标题怎样定
  6. go文件下载(普通文件和压缩文件)
  7. html5把六张图片做成立方体,html5 3D旋转的图片立方体代码
  8. python 数据处理时去除emoji表情
  9. Windows下使用bat脚本批量创建文件夹
  10. 将keras训练好的神经网络模型生成独立于python环境运行的.exe文件并在matlab中调用(上篇)